思路:
box:钥匙盒中钥匙的编号
timeline:时间线
- 字典类型timeline用以记录整个钥匙的借还过程
timeline = {借出时刻/还回时刻:钥匙编号} - 借出钥匙时记录在timeline中的为钥匙编号w,还回钥匙则使用w-n。用以区分借和还,因为题干中要求同一时刻若有借有还则先还后借,负数方便后面排序。
- 若同一时刻存在多次借出钥匙和还回钥匙,按照钥匙的编号排序。在借出钥匙时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()排序即可。
- 在进行多轮记录后得到完整的时间线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]}