问题描述:
试题编号: | 201609-2 |
试题名称: | 火车购票 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。 输入格式 输入的第一行包含一个整数n,表示购票指令的数量。 输出格式 输出n行,每行对应一条指令的处理结果。 样例输入 4 样例输出 1 2 样例说明 1) 购2张票,得到座位1、2。 评测用例规模与约定 对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。 |
如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
用一维数组标记二维座位的购票状态,可以用<algorithm>里的find函数查找座位。
需要注意的是如何判断能在同一排编号相邻的座位买到票,即这条语句:
(index%5>=1&&index%5+p-1<=5)||(index%5==0&&p==1) (index是可以购票的座位的序号)
我也不知道有没有比上面更好的表达方式,暂时只想到上面那条。
AC代码:
#include<iostream>
#include<sstream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;
int issit[101];//值为0表示该序号的座位未有人买票,值为1表示有人买票
memset(issit,0,sizeof(issit));
int p;
while(n--)
{
cin>>p;
int t=1;//从第几个位置开始安排
bool flag=0;//是否安排成功
while(t<=100-p+1&&!flag)//是否可以安排在同一排编号相邻的座位
{
int index=find(issit+t,issit+100+1,0)-issit;//可以安排的第一个位置
if((index%5>=1&&index%5+p-1<=5)||(index%5==0&&p==1))
{
//cout<<"index:"<<index<<endl;
for(int i=index;i<=index+p-1;i++)
{
if(issit[i]) break;
if(i==index+p-1) flag=1;//可以安排在同一排编号相邻的座位
}
if(!flag) t++;
if(flag)
{
for(int i=index;i<=index+p-1;i++)
{
issit[i]=1;
cout<<i<<' ';
}
}
}
else t++;//无法安排在以index为起始位置的同一排编号相邻的座位
}
while(p--&&!flag)//安排在编号最小的几个空座位中(不考虑是否相邻)
{
int index=find(issit+1,issit+100+1,0)-issit;
cout<<index<<' ';
issit[index]=1;
}
cout<<endl;
}
}