题目描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有 20 排、每一排 5 个座位。
为方便起见,我们用 1 到 100来给所有的座位编号,第一排是 1 到 5 号,第二排是 6 到 10号,依次类推,第 20 排是 96到 100 号。
购票时,一个人可能购一张或多张票,最多不超过5张。
如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。
否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
输入格式
输入的第一行包含一个整数 n ,表示购票指令的数量。
第二行包含 n 个整数,每个整数 p 在 1 到 5之间,
表示要购入的票数,相邻的两个数之间使用一个空格分隔。
输出格式
输出 n 行,每行对应一条指令的处理结果。
对于购票指令 p,输出 p 张车票的编号,按从小到大排序。
数据范围
对于所有评测用例,1≤n≤100
,所有购票数量之和不超过 100。
输入样例:
4
2 5 4 2
输出样例:
1 2
6 7 8 9 10
11 12 13 14
3 4
样例解释
购 2 张票,得到座位 1、2。
购 5 张票,得到座位 6 至 10。
购 4 张票,得到座位 11 至 14。
购 2 张票,得到座位 3、4。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 110;
bool st[N];
int main()
{
int n;
cin>>n;
while(n--)
{
int p;
cin>>p;
bool success = false;//标记有没有成功安排
for(int i = 1; i<=100; i+=5)//i每行第一个座位
{
for(int j = 0; j<5; j++)
{
int s = 0;//可以安排的座位数量
for(int k = j; k<5; k++)
if(!st[i+k]) s++;//该行有空位
else break;
if(s>=p)
{
for(int k = 0; k<p; k++)//安排p个座位
{
int t = i+j+k;//该座位编号
st[t] = true;
cout<<t<<' ';
}
success = true;
break;
}
}
if(success) break;
}
if(!success)//没有成功安排
{
for(int i = 1; i<=100 && p; i++)
if(!st[i])
{
p--;
st[i] = true;
cout<<i<<' ';
}
}
cout<<endl;
}
return 0;
}
棒棒!