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