试题编号: | 201609-2 |
试题名称: | 火车购票 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。 输入格式 输入的第一行包含一个整数n,表示购票指令的数量。 输出格式 输出n行,每行对应一条指令的处理结果。 样例输入 4 样例输出 1 2 样例说明 1) 购2张票,得到座位1、2。 评测用例规模与约定 对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。 |
思路:读完题之后,第一印象是用二维数组A[][]来表示火车座位序号,但同时还要找变量来标记火车座位是否已被购买,于是想到把座位定义为结构体,包含座位序号ID和是否售出标记flag。接下来就是模拟购票过程,一行行统计每行剩余座位之和,如果乘客要买的票数小于某行剩余座位号,则他可以买到连票,否则安排在编号最小的几个空座位中(不考虑是否相邻)
#include<iostream>
using namespace std;
struct ticket{
int id; //座位编号
bool flag;//座位状态
};
int main(){
int n;//购票指令数量
cin>>n;
ticket a[20][5]; //定义100个座位
int t=1;
for(int i=0;i<20;i++){
for(int j=0;j<5;j++){
a[i][j].id=t++;
a[i][j].flag=true;
}
}
while(n--){
int people=0;
cin>>people;
for(int i=0;i<20;i++){
int coutseat=0;//统计每行空座数量
for(int j=0;j<5;j++){
if(a[i][j].flag==true){
coutseat++;
}
}
//当购票人数小于这一行空位置数时
if(people<=coutseat){
for(int j=0;j<5;j++){
if(a[i][j].flag==true){
for(int k=j;k<j+people;k++){
cout<<a[i][k].id<<" ";
a[i][k].flag=false;//座位表示已被购买
}
break;
}
}
cout<<endl;
break;//跳出第一个for循环,换下一个人购票
}
//当前行的座位数量小于购票人数时
else{
if(i==19){ //表示最后一行也不满足连坐要求
i=0;
for(i;i<20;i++){
for(int j=0;j<5;j++){
if(a[i][j].flag==true){
cout<<a[i][j].id<<" ";
a[i][j].flag=false;
people--;
if(people==0){
break;
}
}
}
//如果一行不满足的话则换下一行
if(people==0){
break;
}
}
cout<<endl;
break;
}
}
}
}
return 0;
}