CCF 201709 2 公共鑰匙盒 python

2021-10-02 12:32:42 字數 1880 閱讀 6554

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個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到...