题目
问题描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有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。
分析
依据购票数量对座位进行分配,分配条件有两种情况,一是通过连续分配p个座位来完成此次分配;二是当第一种分配无法实现时,通过分配未被占据的前p个号码最小座位来完成此次分配。当某一排的空位数大于需分配的个数时,则可以进行连续分配;当所有排的空位数都小于需分配的个数时,进行第二种分配。
代码
/*
20190920
csp试题2:火车购票
*/
#include <iostream>
using namespace std;
int emptys[20];//每排的空座位数
int p_list[101];
int main(){
//接收数据
int n;
cin >>n;
for(int i=0; i<n; i++){
cin >>p_list[i];
}
//初始每排的空座位数都为5
for(int i=0; i<20; i++){
emptys[i] = 5;
}
//模拟运行
for(int i=0; i<n; i++){
//1. 判断 第i个分配座位是否临近
bool near = false;//初始认为不座位临近
int baseAddr = 0;
for(int j=0; j<20; j++){
//如果空位数 > 要分的座位数
if(emptys[j] >= p_list[i]){
near = true; //此次分配的座位临近
//确定第一个座位的号码
baseAddr = j*5 + (5-emptys[j]) + 1;
//更改emptys[j]
emptys[j] = emptys[j]-p_list[i];
break;
}
}
//2. 输出处理
//如果 第i个分配 座位临近
if(near){
for(int j=0; j<p_list[i]; j++){
cout <<baseAddr + j <<" ";
}
cout <<endl;
}
else { //如果 第i个分配 座位不临近,则选取小的空位逐个分配
for(int j=0; j<p_list[i]; j++){
for(int k=0; k<20; k++){
if(emptys[k] > 0){
cout << k*5 + (5-emptys[k]) + 1 <<" ";
emptys[k] = emptys[k] - 1;
break;
}
}
}
cout <<endl;
}
}
return 0;
}
总结
不需要很复杂的算法,只是去模拟现实生活中的一个工作流程,因此思路还是相当明晰的。