ccf201609-2

试题编号: 201609-2

试题名称: 火车购票

时间限制: 1.0s

内存限制: 256.0MB

问题描述:

  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。

  假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。

  购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。

  假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。

  

输入格式

  输入的第一行包含一个整数n,表示购票指令的数量。

  第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。

  

输出格式

  输出n行,每行对应一条指令的处理结果。

  对于购票指令p,输出p张车票的编号,按从小到大排序。

  

样例输入

4

2 5 4 2

样例输出

1 2

6 7 8 9 10

11 12 13 14

3 4

样例说明

  1) 购2张票,得到座位1、2。

  2) 购5张票,得到座位6至10。

  3) 购4张票,得到座位11至14。

  4) 购2张票,得到座位3、4。

  

评测用例规模与约定

  对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。

#include<bits/stdc++.h>
using namespace std;

int main() {
	int sheng[21];//每排剩几个空座 
	for(int i=0;i<=20;i++)	sheng[i]=5;
	int n,x,flag;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		flag=0;//能不能相邻 
		for(int j=1;j<=20;j++){ 
			if(x<=sheng[j]){//这排能全部放下 
				for(int k=1;k<=x;k++){
					cout<<5*j-sheng[j]+k<<" ";
				}
				flag=1;//能相邻 
				sheng[j]=sheng[j]-x;
				break;
			}
		}
		if(flag==0){//没找到相邻座位 
			int j=1;
			while(sheng[j]<x){
				for(int k=1;k<=sheng[j];k++){
					cout<<5*j-sheng[j]+k<<" ";
				}
				x=x-sheng[j];//更新还没安排的人数 
				sheng[j]=0;//这排安排满了 
				j++;//下一排 
			}
			for(int k=1;k<=x;k++){
					cout<<5*j-sheng[j]+k<<" ";
				}
		}	
		cout<<endl; 
	}
}


全部评论
大佬又来秀技术了
点赞 回复 分享
发布于 2023-02-09 10:33 重庆
有多少个人能看懂的?
点赞 回复 分享
发布于 2023-02-09 11:03 江苏

相关推荐

什么时候才能有offer啊_:十年前我还在刺激战场研究跳伞的底层原理呢
投递牛客等公司9个岗位
点赞 评论 收藏
分享
02-12 00:59
已编辑
哈尔滨工业大学 产品经理
华为 软件开发岗 20.6*16薪 本科
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务