CCF 201709-2 公共钥匙盒 python 满分

56 篇文章 4 订阅

题目叙述

问题描述:略

输入格式:略

输出格式:略

样例

样例输入
5 2
4 3 3
2 2 7
样例输出
1 4 3 2 5
样例说明
	第一位老师从时刻3开始使用4号教室的钥匙,使用3单位时间,所以在时刻6还钥匙。
	第二位老师从时刻2开始使用钥匙,使用7单位时间,所以在时刻9还钥匙。
	每个关键时刻后的钥匙状态如下(X表示空):
	时刻2后为1X345;
	时刻3后为1X3X5;
	时刻6后为143X5;
	时刻9后为14325。
样例输入
5 7
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9
样例输出
1 2 3 5 4

满分证明

在这里插入图片描述

解题思路

基础版

  1. 分别按借还的时间从小到大排序;
  2. 取出最大时间作为遍历使用;
  3. 同一时间先还后借。

大佬版

  1. 按照时间线来处理;
  2. 直接存的时候,进行处理;
  3. 标记是借还是取。

满分代码

基础版

n, k = map(int, input().split())
ss = [list(map(int, input().split())) for _ in range(k)]
# 直接改为还的时间
for i in range(k):
    ss[i][2] = ss[i][1] + ss[i][2]
# 保证同时还,按从小到大顺序
ss.sort()
ke = list(range(1, n + 1))
j = sorted(ss, key=lambda x: (x[1]))
h = sorted(ss, key=lambda x: (x[2]))
max = sorted(list(set(list(map(lambda x: (x[1]), j)) + list(map(lambda x: (x[2]), h)))))
j_index = 0
h_index = 0
for m in max:
    # 同一时刻先还后借
    while m in list(map(lambda x: (x[2]), h)):
        teml = ke.index(0)
        ke[teml] = h[h_index][0]
        h[h_index][2] = -1
        h_index += 1
    while m in list(map(lambda x: (x[1]), j)):
        tem = j[j_index][0]
        id = ke.index(tem)
        ke[id] = 0
        j[j_index][1] = -1
        j_index += 1

for i in range(n):
    print(ke[i], end=" ")

大佬版

n, k = map(int, input().split())
fn = list(range(1, n + 1))
ss = []
for _ in range(k):
    w, s, c = map(int, input().split())
    ss.append([s, True, w])
    ss.append([s + c, False, w])
ss.sort()
for t, flag, k in ss:
    if flag:
        fn[fn.index(k)] = 0
    else:
        fn[fn.index(0)] = k
for i in range(n):
    print(fn[i], end=" ")

感谢及参考博文

部分内容参考以下链接,这里表示感谢 Thanks♪(・ω・)ノ
参考博文1 201709-2 python CCF 更简单的思路和代码 100分
https://blog.csdn.net/CarterYang0/article/details/103747699

需者自取传送门(∩ᄑ_ᄑ)⊃━☆【CCF 2013-2021】本博主整理历年至少前两题 python 满分代码目录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值