#19445: 題解(X 抽象提示(O


310573sao (Jiburiru)

學校 : 新北市立板橋高級中學
編號 : 48055
來源 : [59.127.176.2]
最後登入時間 :
2020-04-01 20:44:03
e407. 買包子 (Bun) -- 108學年度板橋高中校內資訊學科能力競賽 | From: [59.127.176.2] | 發表日期 : 2019-10-01 10:33

首先可以發現卡在隊伍最前面的人需要的包子數是嚴格遞增的

你如果比他少的話你會被他卡在隊伍中等隊首買到他要的包子數

 

隊伍所需包子數可以用 priority_queue 維護

同時計算目前發了多少包子

假設 wait (買到包子但在等隊首離開), leave(買到包子且離開了)

ans = wait-leave

拿到所需的包子的人就計算 wait + 1

 

隊首拿到所需包子以後,會有一大票的人會離開,人數則是當前隊首和下一個隊首中間的人數, 因為中間人所需包子數一定小於當前隊首,所以當隊首買到包子以後後面的人會一起離開,你只要記錄隊首們買包子的順序就可以算出中間有多少人!

 

還有一點 假設現在已經發了 10 個包子 ,新來一個人要求買5個包子,那你可以視為他要15個包子,這樣處理包子數就比較簡單了

 

用了一個queue 放隊首們, 一個priority_queue 中間人要買的包子的數

time complexity: O(q log q)

 
#19446: Re:題解(X 抽象提示(O


310573sao (Jiburiru)

學校 : 新北市立板橋高級中學
編號 : 48055
來源 : [59.127.176.2]
最後登入時間 :
2020-04-01 20:44:03
e407. 買包子 (Bun) -- 108學年度板橋高中校內資訊學科能力競賽 | From: [59.127.176.2] | 發表日期 : 2019-10-01 10:47

補充例子

e.g. 排隊的人要買的包子數 [5, 2, 3, 2, 8, 1 ,2, 11]

排序的q =[1, 2, 2, 2, 3]  (隊首不需要考慮 因為買到包子就跑了)

當你發了2個包子以後 把<=2的處理掉

排序的q =[3] 目前 wait = 4, leave=0

當你發到5個包子以後

排序的q =[] , wait = 5, leave=0

但因為隊首(5) 離開了

我們知道下一個隊首(8)是第5個人買的 也就是說 中間有 5-1-1 =3個人

leave=3, 因此目前只剩 wait-leave=5-3=2個人在等

這樣就可以一直維護 wait, leave的值

複雜度 insert = log(size), pop=constant

 
ZeroJudge Forum