CCF-火车购票

问题描述 

  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。  
  假设一节车厢有 20 排、每一排 5 个座位。为方便起见,我们用 1 100 来给所有的座位编号,第一排是 1 5 号,第二排是 6 10 号,依次类推,第 20 排是 96 100 号。  
  购票时,一个人可能购一张或多张票,最多不超过 5 张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。  
  假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。  
输入格式  
  输入的第一行包含一个整数 n ,表示购票指令的数量。  
  第二行包含 n 个整数,每个整数 p 1 5 之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。  
输出格式  
  输出 n 行,每行对应一条指令的处理结果。  
  对于购票指令 p ,输出 p 张车票的编号,按从小到大排序。  
样例输入  

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;  //释放动态数组;
}

猜你喜欢

转载自blog.csdn.net/kiss__soul/article/details/80184395