试题编号: | 201609-2 |
试题名称: | 火车购票 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。 输入格式 输入的第一行包含一个整数n,表示购票指令的数量。 输出格式 输出n行,每行对应一条指令的处理结果。 样例输入 4 样例输出 1 2 样例说明 1) 购2张票,得到座位1、2。 评测用例规模与约定 对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。 |
问题链接:CCF201609-2 火车购票
问题分析
由于本题只需要输出乘客购票位置,所以不需要将购票信息存储起来。
我的思路是设置一个长度为20的数组,其中每个元素初始值都为5,代表着这一排能坐5个人,同时做下去一个人这个数字就减去1。这样只需要通过简单的地址计算就能知道这排能坐多少个人,坐下去的人座位号是什么。
但是在编写程序的时候不知道哪里出了问题,只能得90分,希望发现我的程序bug的同学能够在评论区留言(文末附上满分的c++代码)
感谢qq_37142807同学指正了我的错误,我将会在下面代码后附上正确代码
不是满分的代码
#首先先构造一个大小为20的数组,每个元素存储的都为5.代表每一排座位都还有5个座位没有人
#如果哪一排坐了人,数字就减去相应的人数。等于0时代表没有了座位
sit=[]
for i in range(20):
sit+=[5]
#输入数据
n=int(input())
ticket=input().split()
#开始对数据进行处理
for i in range(n):
ticket[i]=int(ticket[i])
#遍历sit数组找座位
for j in range(20):
#找到一个编号最小的能坐下ticket[i]个人的座位
if sit[j]>=ticket[i]:
#下面分成两个步骤是为了格式化输出
#如果当只坐一个人的时候,直接输出他的位置即可
if ticket[i]==1:
#简单计算就可以得到下面这个表达式
print(j*5+(5-sit[j])+1)
sit[j]-=1
break
#如果有多个人的时候,就需要先输出一个人的座位号,然后从第二个人开始,输出一个空格加上他的座位号。最后再换行即可
else:
print(j*5+(5-sit[j])+1,end='')
sit[j]-=1
for t in range(1,ticket[i]):
print('',j*5+(5-sit[j])+1,end='')
sit[j]-=1
print()
break
考虑不周之处
没有考虑到当现有座位无法满足要坐的人数时的情况,例如现在需要一起坐5个人,但是没有连在一起的5个座位了。所以这5个人只能分开坐下(按照编号从小到大坐下)
做后再次感谢qq_37142807同学
满分代码
#首先先构造一个大小为20的数组,每个元素存储的都为5.代表每一排座位都还有5个座位没有人
#如果哪一排坐了人,数字就减去相应的人数。等于0时代表没有了座位
sit=[]
for i in range(20):
sit+=[5]
#输入数据
n=int(input())
ticket=input().split()
#开始对数据进行处理
for i in range(n):
ticket[i]=int(ticket[i])
#下面为新增代码:
#
#
#judge用来判断是否有座位能放下连续的ticket[i]个人
judge=True
#上面为新增代码,
#
#
#遍历sit数组找座位
for j in range(20):
#找到一个编号最小的能坐下ticket[i]个人的座位
if sit[j]>=ticket[i]:
#下面分成两个步骤是为了格式化输出
#如果当只坐一个人的时候,直接输出他的位置即可
if ticket[i]==1:
#简单计算就可以得到下面这个表达式
print(j*5+(5-sit[j])+1)
sit[j]-=1
break
#如果有多个人的时候,就需要先输出一个人的座位号,然后从第二个人开始,输出一个空格加上他的座位号。最后再换行即可
else:
print(j*5+(5-sit[j])+1,end='')
sit[j]-=1
for t in range(1,ticket[i]):
print('',j*5+(5-sit[j])+1,end='')
sit[j]-=1
print()
break
#下面为新增代码:
#
#
#下面为新增代码,代表火车剩余的座位无法将ticket[i]个人放到一起坐的情况
#
#
elif j==19 and sit[j]<ticket[i]:
judge=False
if judge==False:
person=ticket[i]
output=[]
for j in range(20):
while(person>0 and sit[j]>0):
output+=[j*5+(5-sit[j])+1]
person-=1
sit[j]-=1
#格式化输出这种情况
print(output[0],end='')
for j in range(1,len(output)):
print('',output[j],end='')