思路:
题干中提到,最多购票数不超过5张
- 使用字典存储一节车厢的座位表
例:
{0: [1, 2, 3, 4, 5],
1: [6, 7, 8, 9, 10],
2: [11, 12, 13, 14, 15],
…
19: [96, 97, 98, 99, 100]} - 遍历购票指令,遍历座位表的每一排,如果该条购票指令的购票数<=此排剩余的空座位数,则购买此排座位,并在座位表中删除此排对应的座位号;如果购买数> 当前排的空座位数,则重新遍历每排,填满每排的空位,直到满足购票数
"""
测试用例1
4
2 5 4 2
测试用例2
21
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5
"""
n = int(input())
data = list(map(int, input().split())) # 购票指令
seat = {}
result = [] # 购票结果
row = 20 # 行数
# 创建一节车厢的座位表
for i in range(row):
seat[i]= list(range(i*5+1, i*5+6))
# print(seat)
for i in range(n): # 遍历每一条购票指令
index = 0
num = data[i] # 此条指令的购票数量
for j in range(row):
length = len(seat[j]) # 此排剩下的座位数
if num <= length: # 如果购票数<=此排剩余座位数
result.append(seat[j][:num]) # 买此排剩余座位
for k in range(num): # 在座位表中删除此排被购买的座位号
seat[j].pop(0)
break
else: # 如果购票数>小于此排剩余座位数
index += 1 # 转为下一行
if index == row: # 如果遍历的所有行,发现每行剩余座位数均<此条指令的购票数
# 即无法购买全部相邻的座位
temp = []
num = data[i] # 此条指令的购票数量
for j in range(row):
length = len(seat[j]) # 此行剩余座位数
if length > 0:
temp.extend(seat[j][:num]) # extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
for k in range(length): # 在座位表中删除此排被购买的座位号
seat[j].pop(0)
num = num - length # 还需购买的座位数
if num == 0:
result.append(temp)
break
for re in result:
print(" ".join(map(str, re)))