201609-2满分实验-csp(C语言)

问题描述

请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。

假设一节车厢有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。

#include
int main(){
 int n;
 scanf("%d",&n);
 int count[n];
 int i;
 for(i=0;i<n;i++){
  scanf("%d",&count[i]);}
 int left[20];
 for (i = 0; i < 20; i++)
  {
    left[i] = 5; 
  }
 int flag[100];
  for (i = 0; i < 100; i++)
  {
    flag[i] = 1; 
  }//没有被占用 
 for(i=0;i<n;i++){
  int j;
  for(j=0;j<20;j++){
  
   int find=0;
   if(left[j]>=count[i])
   {
    int k;
    for(k=5*j;k<5*j+5;k++)
    {
     if(flag[k]==1&&(5-k%5)>=count[i]){ //
     //不可能出现 12 45 号被分配,而中间没有分配的情况
      find=1;
      break; 
     }
          }
   if(find==1)
   { 
     left[j]=left[j]-count[i];
     int m;
     for(m=k;m<k+count[i];m++)
      {
        flag[m]=0;
        printf("%d ",m+1);
      }
     printf("\n"); 
     break;//如果找到了话就跳出来这个寻找剩下的left的集合 
   }
      }//if(left[j]>=count[i])
  }//循环
  if(j==20)
  {   int n;
   for(n=0;n<100;n++){
    if(flag[n]){
     flag[n]=0;
     left[n/5]--;
     printf("%d ",n+1);
    }
   }
   printf("\n"); 
  } 
 } 
 return 0;
} 

你可能感兴趣的:(csp)