原题
题目分析
1.连票优先原则,最小位置优先分配原则;
2.使用的数据结构比较简单,一个数组表示每排座位的还能分配的余票,便于查找是否有连票的座位;一个数组保存每排当前能分配的座位的指针,因为座位分配是总是从最小的开始,所以这个指针之前的座位肯定是全部已经分配的;
代码
/*火车购票*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=20;
const int col=5;
int seat[N]; //座位指针
int remain[N]; //余票池
int main()
{
int n,q,flag=0;
fill(seat,seat+N,1);
fill(remain,remain+N,5);
cin>>n;
for(int i=0;i<n;i++){
flag=0;
cin>>q;
for(int j=0;j<N;j++){
if(remain[j]>=q){
while(q--){
cout<<seat[j]+j*5<<" ";
seat[j]++;
remain[j]--;
}
cout<<endl;
flag=1;
break;
}//连续座位分配成功
}
//如果没有相邻的票
if(flag==0){
int j=0;
while(q&&j<20){
if(seat[j]<=5){
cout<<seat[j]+j*5<<" ";
q--;
seat[j]++;
remain[j]--;
}
else j++;
}
cout<<endl;
}
}
return 0;
}