火车购票问题(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 }
原文地址:https://www.cnblogs.com/yxh-amysear/p/7469032.html