XDOJ-购票系统
标题
购票系统
类别
综合
时间限制
1S
内存限制
256Kb
问题描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有20排、每一排5个座位。为方便起见,
我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
购票时,一个人可能购一张或多张票,最多不超过5张。
如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位
。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令,输出购票结果。
例如:若一次购买2,5,4,2张票得到的购票结果为:
1) 购2张票,得到座位1、2。
2) 购5张票,得到座位6至10。
3) 购4张票,得到座位11至14。
4) 购2张票,得到座位3、4。
输入说明
输入由两行构成。
第一行包含一个整数n,表示购票指令的数量,1 ≤ n ≤ 100。
第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个整数之间使用一个空格分隔,
所有购票数量之和不超过100。
输出说明
输出n行,每行对应一条购票指令的处理结果。即对于购票指令p,按从小到大排序输出p张车票的编号。
输入样例
4
2 5 4 2
输出样例
1 2
6 7 8 9 10
11 12 13 14
3 4
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int a[20][6] ,b[100],n,i,j,m=0,t=0,p,q;
bool result = true;
for (i = 0; i < 20; i++)//将20排座位,每个座位初值赋为0,a[i][5]来记录改排还有多少空位
{
a[i][5] = 5;
for (j = 0; j < 5; j++)
{
a[i][j] = 0;
}
}
cin >> n;
for (i = 0; i < n; i++)//储存购票命令
{
cin >> b[i];
}
for (i = 0; i < n; i++)//开始购票分配座位
{
for (j = 0; j < 20; j++)
{
if (b[i] <= a[j][5])//此时为可以买到连续最小号,j+1即为符合要求的排数
{
result = false;//将result赋值为false
break;
}
}
if (result)//result初值为真,即未买到连续最小号,只能从小到大寻找空位
{
for (p = 0; p < 20; p++)
{
for (q = 0; q < 5; q++)
{
if (a[p][q] == 0)//已经将购票成功座位值赋为1,为0表示还没有被买到
{
a[p][q] = 1;
cout << p * 5 + q + 1 << " ";//p*5+q+1即为座位号数
t++;
a[p][5]--;
}
if (t == b[i])
break;
}
if (t == b[i])//两个break跳出两层循环
break;
}
t = 0;//变量重置
cout << endl;
}
else
{
for (m = 5 - a[j][5]; m < 5 - a[j][5] + b[i]; m++)//将购票成功的座位值赋为1,表示有人了
{
a[j][m] = 1;
cout << j * 5 + m + 1 << " ";
}
a[j][5] -= b[i];//更新该排所剩空位
cout << endl;
}
result = true;//变量重置
}
return 0;
}
个人认为编程一定要有好习惯,不然很有可能出事,比如此篇中变量用完重置
ps:如有错误敬请指正,如有问题欢迎评论区讨论或私信
邮箱:1654407501@qq.com如果对你有用的话,请点赞并关注,近期不定时更新新内容