问题描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。假设一节车厢有 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 。
算法实现
只需用一个大小为20的int类型一维数组记录每一排座位的使用情况即可;
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n; //多少条命令;
cin >> n;
int *ord = new int [n]; //存储命令内容的数组;
for (int i = 0; i < n; i++) //输入命令内容;
{
cin >> ord[i];
}
int seat[20] = { 0 }; //记录每排座位使用情况,初始为0;
bool getSeat = false; //标记一条指令是否成功分配到座位;
for (int i = 0; i < n; i++)
{
getSeat = false; //每次重置为false;
for (int j = 0; j < 20; j++) //20排座位,按序查看;
{
if ((5-seat[j])<ord[i]) //这一排没有足够连坐座位;
continue;
else
{
getSeat = true; //标志能够分配到座位;
for (int k = 0; k < ord[i]; k++)
{
cout << 5 * j + seat[j] + k + 1<<" ";
}
cout << endl;
seat[j] += ord[i];
break;
}
}
if (!getSeat) //查看20排后没有连座;
{
int needNum = ord[i]; //记录所需座位数;
for (int j = 0; j < 20;j++) //按排分散分配座位;
{
if ((5-seat[j])>0)
{
if ((5-seat[j])<needNum) //这排空余的座位不够分配完还需要的座位;
{
needNum = needNum - (5 - seat[j]); //更新还需要的座位数;
for (int k = 0; k < 5 - seat[j]; k++) //打印此次分配到的座位;
{
cout << 5 * j + seat[j] + k + 1 << " ";
}
seat[j] = 5; //将这排座位的使用情况更新为5,表示没有空座了;
}
else //这排空余的座位足够分配完还需要的座位,那么此次分配之后,结束循环;
{
for (int k = 0; k < needNum; k++) //打印此次分配到的座位;
{
cout << 5 * j + seat[j] + k + 1 << " ";
}
cout << endl;
seat[j] += needNum; //更新这排座位的使用情况;
break;
}
}
}
}
}
delete[]ord; //释放动态数组;
}