CCF 201609-2 火车购票 python

在这里插入图片描述

思路:

题干中提到,最多购票数不超过5张

  1. 使用字典存储一节车厢的座位表
    例:
    {0: [1, 2, 3, 4, 5],
    1: [6, 7, 8, 9, 10],
    2: [11, 12, 13, 14, 15],

    19: [96, 97, 98, 99, 100]}
  2. 遍历购票指令,遍历座位表的每一排,如果该条购票指令的购票数<=此排剩余的空座位数,则购买此排座位,并在座位表中删除此排对应的座位号;如果购买数> 当前排的空座位数,则重新遍历每排,填满每排的空位,直到满足购票数
"""
测试用例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)))
            

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值