zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    树状数组
    线段树
    最短路(FLOYD)
    欧拉函数
    筛素数
    并查集
    背包方案数问题(礼物)
    [BeijingWc2008]雷涛的小猫
    受欢迎的牛[HAOI2006]
    删除物品[JLOI2013]
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308926.html
Copyright © 2011-2022 走看看