• 火车购票问题(16年ccf)


    火车购票问题(16年ccf)

    问题描述
      请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
      假设一节车厢有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<iostream>
     2 using namespace std;
     3 int arr[20][5];
     4 
     5 void FenPei(int a)
     6 {
     7     int count=0,Done = 0;
     8     for(int y=1;y<=20;y++)
     9     {
    10         for(int x=1;x<=5;x++)
    11         {
    12             if(arr[y][x]==0&&count<a) count++;//数一排中连续空座的数目 
    13         }
    14         if(count==a)//表示当前排有空座 ,分配空座,并将结果进行打印 
    15         {
    16             int x=1;
    17             while(arr[y][x]) x++;//定位到空座
    18             //将空座置为1,打印输出座位号
    19             while(count--)
    20             {
    21                 arr[y][x]=1;
    22                 cout<<((y-1)*5+x);
    23                 x++;
    24                 if(count!=0) cout<<" ";
    25                 else cout<<endl;
    26              }
    27              Done = 1;
    28             break;
    29         }
    30         count=0;//在数下一排前将计数器置0 
    31     }
    32     if(Done==0){
    33             //遍历完毕没有发现空座
    34             for(int y=1;y<=20;y++)
    35             {
    36                 for(int x=1;x<=5;x++)
    37                 {
    38                     if(arr[y][x]==0)
    39                         {
    40                             if(a--)
    41                             {
    42                                 //将空座置为1,打印输出座位号
    43                                 arr[y][x]=1;
    44                                 cout<<((y-1)*5+x);
    45                                 if(a!=0) cout<<" ";
    46                                 else cout<<endl;
    47                             }
    48                         }
    49                  } 
    50              } 
    51     }
    52 
    53 }
    54 int main()
    55 {
    56     int n=0,GouPiao[100];
    57     //初始化座位,置为0 
    58     for(int y=0;y<=20;y++)
    59     {
    60         for(int x=0;x<=5;x++)
    61             arr[y][x] = 0;
    62      } 
    63      
    64     cin>>n;
    65     for(int i=0;i<n;i++)
    66     {
    67         cin>>GouPiao[i];
    68     }
    69     for(int i=0;i<n;i++)
    70     {
    71         FenPei(GouPiao[i]);
    72     }
    73     return 0;
    74 }

    啊。更新更新,应该是变懒了,不就是最多分配5个座位么。。。

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 bool buy[101];
     5 
     6 void buyTicket(int num)
     7 {
     8     if(num == 1)
     9     {
    10         for(int i=1;i<=100;i++)
    11         {
    12             if(buy[i]){
    13                 buy[i] = false;
    14                 cout<<i<<endl;
    15                 return;
    16             }
    17         }
    18     }else if(num == 2){
    19         for(int i=1;i<=100;i++)
    20         {
    21             if(buy[i] && buy[i+1] && i%5!=0){
    22                 buy[i] = false;buy[i+1] = false;
    23                 cout<<i<<" "<<i+1<<endl;
    24                 return;
    25             }
    26         } 
    27     }else if(num == 3){
    28         for(int i=1;i<=100;i++){
    29             if(buy[i]&&buy[i+1]&&buy[i+2]&&i%5!=4 && i%5!=0){
    30                 buy[i] = false;buy[i+1] = false;buy[i+2] = false;
    31                 cout<<i<<" "<<i+1<<" "<<i+2<<endl;
    32                 return;
    33             }
    34         }
    35     }else if(num==4){
    36         for(int i=1;i<=100;i++){
    37             if(buy[i]&&buy[i+1]&&buy[i+2]&&buy[i+3]&&i%5!=3&&i%5!=4 && i%5!=0){
    38                 buy[i] = false;buy[i+1] = false;buy[i+2] = false;buy[i+3] = false;
    39                 cout<<i<<" "<<i+1<<" "<<i+2<<" "<<i+3<<endl;
    40                 return;
    41             }
    42         }
    43     }else if(num==5){
    44         for(int i=1;i<=100;i++){
    45             if(buy[i]&&buy[i+1]&&buy[i+2]&&buy[i+3]&&buy[i+4]&&i%5!=2&&i%5!=3&&i%5!=4 && i%5!=0){
    46                 buy[i] = false;buy[i+1] = false;buy[i+2] = false;buy[i+3] = false;buy[i+4] = false;
    47                 cout<<i<<" "<<i+1<<" "<<i+2<<" "<<i+3<<" "<<i+4<<endl;
    48                 return;
    49             }
    50         }
    51     }
    52     ///没有连坐
    53     for(int i=1;i<=100;i++)
    54     {
    55         if(buy[i]){
    56             buy[i] = false;
    57             cout<<i;
    58             if(--num) cout<<" ";
    59             else{
    60                 cout<<endl;return;
    61             }
    62         }
    63          
    64      }
    65 }
    66 
    67 int main()
    68 {
    69     int n;
    70     while(cin>>n)
    71     {
    72         memset(buy,true,sizeof(buy));
    73         while(n--){
    74             
    75             int num;
    76             cin>>num;
    77             buyTicket(num);
    78         }
    79     }
    80         
    81 
    82     return 0;
    83 }
  • 相关阅读:
    硬件IC汇总
    stm8s103调试注意点
    感悟短句
    USB接口
    液晶屏驱动注意
    四数之和
    所有奇数长度子数组的和
    秋叶收藏集
    删除中间节点
    组合总和
  • 原文地址:https://www.cnblogs.com/yxh-amysear/p/7469032.html
Copyright © 2020-2023  润新知