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 24 3 3
2 2 7
測試用例2
5 71 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)]=
0print
(" "
.join(
map(
str, box)
))
為了方便理解,以測試用例2為例,給出timeline
timeline =
CCF 201709 2 公共鑰匙盒
試題編號 201709 2 試題名稱 公共鑰匙盒 問題描述 有乙個學校的老師共用n個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。鑰匙盒一共有n個掛鉤,從左到右排成一排,用來掛n...
CCF 201709 2 公共鑰匙盒
問題描述 試題編號 201709 2 試題名稱 公共鑰匙盒 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 有乙個學校的老師共用n個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將...
CCF 201709 2 公共鑰匙盒
試題編號 201709 2 試題名稱 公共鑰匙盒 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 有乙個學校的老師共用n個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到...