题目叙述
问题描述:略
输入格式:略
输出格式:略
样例
样例输入
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
满分证明
解题思路
基础版
- 分别按借还的时间从小到大排序;
- 取出最大时间作为遍历使用;
- 同一时间先还后借。
大佬版
- 按照时间线来处理;
- 直接存的时候,进行处理;
- 标记是借还是取。
满分代码
基础版
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 满分代码目录