CCF 201709-2 公共钥匙盒 python

在这里插入图片描述

思路:

box:钥匙盒中钥匙的编号
timeline:时间线

  1. 字典类型timeline用以记录整个钥匙的借还过程
    timeline = {借出时刻/还回时刻:钥匙编号}
  2. 借出钥匙时记录在timeline中的为钥匙编号w,还回钥匙则使用w-n。用以区分借和还,因为题干中要求同一时刻若有借有还则先还后借,负数方便后面排序。
  3. 若同一时刻存在多次借出钥匙和还回钥匙,按照钥匙的编号排序。在借出钥匙时timeline中记录的是钥匙编号w,直接使用sort()进行排序;而还回钥匙记录的是w-n,本身钥匙编号越小,w-n也越小(比如n=5: w=1, w-n=-4; w=2, w-n=-3…; w=5, w-n=0),同样也使用sort()排序即可。
  4. 在进行多轮记录后得到完整的时间线timeline。对timeline以时刻(即字典中的键)进行排序。遍历timeline字典中的每一个键,再遍历每一个键对应的值。如果值>0,表示此刻正在进行“借”操作,则将box中该钥匙位置置为0;如果值<=0表示此刻正在进行“还”操作,则在box中选取最左边一个为零的位置放置该钥匙。
"""
测试用例1
5 2
4 3 3
2 2 7

测试用例2
5 7
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9
"""
N, K = map(int, input().split())
timeline = {} # 时间线
box = [i+1 for i in range(N)] # 钥匙盒
for i in range(K):
    w, s, c = map(int, input().split())
    # 借钥匙
    if s not in timeline:
        timeline[s] = []
    timeline[s] += [w]
    timeline[s].sort() #从小到大排序,因为钥匙是按编号从小到大借出
    # 还钥匙
    if s+c not in timeline:
        timeline[s+c] = []
    timeline[s+c] += [w-N] # 为了区分借钥匙和还钥匙,使用w-N(<0)
    timeline[s+c].sort() # 从小到大排序,因为钥匙是按编号从小到大还回

for t in sorted(timeline.keys()): # dict.keys() 字典的key()方法返回一个字典的所有键
    for x in timeline[t]:
        if x <= 0:
            box[box.index(0)] = N+x # list.index(x[, start[, end]]) index() 函数用于从列表中找出某个值第一个匹配项的索引位置
        else:
            box[box.index(x)] = 0
print(" ".join(map(str, box)))

为了方便理解,以测试用例2为例,给出timeline
timeline = {1: [1], 15: [-4, -2, 1], 3: [3], 27: [-4, -3], 7: [2], 18: [3], 30: [-2, 5], 21: [4], 40: [-1], 39: [0]}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值