CCF2016092火车购票
问题描述请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有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 <stdio.h> 2 3 int seat[20][5] ;//表示座位 4 int order[105];//存储购票指令 5 6 int main() 7 { 8 int i , j ,k, n; 9 scanf("%d" , &n); 10 for(i = 0 ; i < n ; i++) 11 { 12 scanf("%d",&order[i]); 13 } 14 for(i= 0 ; i <20;i++) 15 {//初始化座位,最开始都是没被购买的,使其为‘1’ 16 for(j=0;j<5;j++) 17 { 18 seat[i][j] = 1; 19 } 20 } 21 for(i = 0 ; i < n ; i++) 22 {//执行n 个购票指令 23 for(j = 0 ; j < 20 ; j++) 24 {//检查每一行座位 25 int num = order[i]; 26 if(order[i] <= (seat[j][0] +seat[j][1] +seat[j][2] +seat[j][3] +seat[j][4] )){//如果 i 排的剩余座位数不小于所需购票的张数 27 for(k = 0 ; k < 5 ;k++)//则,在第 i 排出票 28 { 29 //int num = order[i]; 30 if(seat[j][k] == 1){//从这排的第一张座位开始检查,有空座就出票 31 seat[j][k] = 0;//出完票,这个座位就不在剩余,置为‘0’ 32 printf("%d ",j*5 +k +1);//打印座位编号 33 num --;//剩余需要购票的张数减一 34 if(num <= 0) break;//指令所需要的票都出完了,不再检查后面的座位 35 } 36 } 37 } 38 if(num <= 0) break;//一个指令执行完,换下一个指令 39 } 40 if(j == 20){//如果从第一排到第20排都没有连续的空座位满足购票指令(此时经过上一轮的循环 j =20),则从第一排开始寻找空座位见缝插针出票 41 int num = order[i]; 42 for(j = 0 ; j < 20 ; j++) 43 { 44 for(k = 0 ; k < 5 ; k++) 45 { 46 if(seat[j][k] == 1){ 47 seat[j][k] = 0 ; 48 printf("%d ",j*5 +k +1);//打印座位编号 49 num--; 50 if(num <= 0) break;//满足了出票的张数就不再寻找空座位 51 } 52 } 53 if(num <= 0) break;//指令完成,进入下一个指令 54 } 55 } 56 printf("\n"); 57 } 58 return 0 ; 59 }