火车购票
题目
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有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
样例解释
购2张票,得到座位1、2。
购5张票,得到座位6至10。
购4张票,得到座位11至14。
购2张票,得到座位3、4。
提示
对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。
参考代码
#include<stdio.h>
int main ()
{
int n;
scanf("%d",&n);
int a[20][5]={0},c[20];
int b[n];
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
for(int i=0;i<20;i++)
{
c[i]=5;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<20;j++)
{
if(b[i]<=c[j])
{
int count=0;
for(int k=0;k<5;k++)
{
if(a[j][k]==0)
{
printf("%d ",j*5+k+1);
a[j][k]=1;
count++;
if(count==b[i])
{
break;
}
}
}
c[j]=c[j]-b[i];
printf("\n");
break;
}
else if(j==19)
{
int count=0;
for(int x=0;x<20;x++)
{
if(count==b[i])
{
break;
}
for(int k=0;k<5;k++)
{
if(a[x][k]==0)
{
printf("%d ",x*5+k+1);
a[x][k]=1;
c[x]=c[x]-1;
count++;
if(count==b[i])
{
break;
}
}
}
}
}
}
}
return 0;
}
我的思路
5个座位一排,一共有20排,用一个二维数组来表示,二维数组的值0表示未购票,1表示已购票。再用一个数组储存每一排剩余座位的个数。购票时我们需要遍历这20排,如果有一排剩余的票大于等于需要购票的数量,就可以在这一排安排位置,将座位的值变为1,且剩余座位个数减去购票数量,继续下一次购票(同上)。若遇到遍历完所有的位置没有相连的位置,我们需要从最小的编号开始,如果座位的值为0的位置安排(具体参考以上代码)。