CCF CSP 201609-2 火车购票
思路:
1.设立一个二维数组来表示i行j列是否被购买;
2.设立一个一维数组来表示第i行最多剩几个连坐;
3.对于每个订单,扫一遍一维数组,如果能找到连坐就买连坐,同时修改两个数组中的信息;如果不能找到连坐就开始遍历二维数组,找到空位就购买,同时修改两个数组中的信息;
代码:
#include<bits/stdc++.h>
using namespace std;
#define p_b(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
bool seat[20][5];//座位被购买情况
int maxn[20];//某排最大相邻数
int main(){
int n;
cin>>n;
fill(maxn,maxn+20,5);
rp(i,n){
int p;
cin>>p;
int posx=0;
while(posx<20&&maxn[posx]<p) posx++;
if(posx<20){
int posy=0;
while(seat[posx][posy]) posy++;
int beg=posx*5+posy+1;
cout<<beg;
for(int j=1;j<p;j++) cout<<' '<<beg+j;
fill(&seat[posx][posy],&seat[posx][posy]+p,true);
maxn[posx]-=p;
}else{
vector<int> v;
rp(j,20) rp(k,5){
if(!seat[j][k]){
seat[j][k]=true;
maxn[j]--;
v.p_b(j*5+k+1);
if(!(--p)) goto here;
}
}
here:cout<<v[0];
for(int i=1;i<v.size();i++) cout<<' '<<v[i];
}
putchar('\n');
}
return 0;
}