自动分配座位

问题描述
  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
  假设一节车厢有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。
  1. #include
  2. using namespce std;
  3.  
  4. int main()
  5. {
  6.    int n, t;
  7.    int a[21][6] = {0}; 
  8.    
  9.    for(int i=0; i<20; i++)
  10.         a[i][5] = 5;
  11.    cin>>n;
  12.    while(n--)  
  13.     { 
  14.        cin>>t;
  15.        int flag=0;
  16.        for(int i=0; i<20; i++)  //有连续座位
  17.        {
  18.           if(a[i][5]>=t)
  19.           {
  20.              a[i][5]-=t;
  21.             for(int j=0; j<5; j++)
  22.             {
  23.                 if(!a[i][j])
  24.                 {
  25.                     a[i][j]=1;
  26.                       t--;
  27.                      if(t)     printf("%d", i*5+j+1);
  28.                      else
  29.                       {
  30.                         if(n)  printf("%d", i*5+j+1);
  31.                         else   printf("%d", i*5+j+1);
  32.                         flag=1;
  33.                         break;
  34.                       }
  35.                    }
  36.                }
  37.             }
  38.         if(flag)  break;
  39.    }
  40.     if(!flag)
  41.    {
  42.      for(int i=0; i<20; i++)
  43.      {  for(int j=0; i<5; j++)
  44.         {
  45.            if(!a[i][j])
  46.             {  a[i][j]=1;
  47.                 t--;
  48.                 a[i][5]--;
  49.               if(t)  printf("%d", i*5+j+1);
  50.               eles{
  51.                     if(n) printf("%d", i*5+j+1);
  52.                     else  pritnf("%d", i*5+j+1);
  53.                     flag=1;
  54.                     break;
  55.                    }
  56.                }
  57.            }
  58.            if(flag) break;     
  59.         }
  60.       }
  61.   }
  62.     return 0;
  63. }   
  64. /*从前向后遍历数组的每一行,如果该行的空余数量大于等于t,遍历该行,输出连续座位,break
    否则,从第一行空位开始往下数t个,输出并标记*/
  65.      

  66. 另附博客:http://www.cnblogs.com/zhurb/p/6056105.html   
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值