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('
');
	}
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308927.html