#19254: 賽後題解


310573sao (Jiburiru)

學校 : 新北市立板橋高級中學
編號 : 48055
來源 : [59.127.176.2]
最後登入時間 :
2020-04-01 20:44:03
e153. 感應燈 -- 108學年度板橋高中校內資訊學科能力競賽Day2_pD310573sao | From: [59.127.176.2] | 發表日期 : 2019-09-20 20:33

如何選擇開燈的順序,才會讓最多燈同時亮的 ?

首先,同一盞燈不會需要開第二次

每次開燈時間都是重新計算,所以就算你又重新開一次燈,也只會浪費前一次開燈的機會,不如開別盞燈可能讓燈亮的更多。

第二,開燈一定是連續,不然會白白浪費。

 

綜上所述你要在第0, 1, 2 … n-1 分鐘的時候考慮開燈的順序

某個直覺想法是每次從關著的燈挑一個能開最久的,乍看之下蠻合理的,但有些情況把開著的燈重新計時會更好。

 

5 1

-1 -1 -1 -1 1

1 2 3 5 4

正解: 5

錯誤的貪心: 4



我們知道每盞燈持續亮著的時間,有些燈下一分鐘就關了當然不能太早開。考慮第k分鐘開燈後,目前亮著燈除了本來就開著卻還沒關掉的以外,都是前幾分鐘開的燈,第 k-1分鐘開著燈必定持續至少 2 分鐘,第 k-2秒開著燈必定持續至少 3 分鐘 …

 

e.x. 3分鐘的時候 你能開3盞燈 且持續時間可能如下:

1, 2, 3

1, 2, 5

1, 3, 6

可以保證任一個 t≥ i



開 set 儲存所有可以前幾分鐘開燈的時間 (1, 2, … , inf)

如果某盞燈持續 k 分鐘 ,就將 set 中某個≤ k的數字delete,代表 前k 分鐘可以打開某盞燈並持續到現在。

期間一樣維護還開著的燈,並把關掉的燈從set中查找能不能重開且亮到現在。

 

ans=max(ans, 還開著的燈 +min(set中被delete的個數, 當前能開燈的數量 ) )

總時間複雜度: O(NlogN)



O(N):

對於已經開著燈他關燈的時間可以用陣列儲存

同時每次算上能持續開 k 分鐘的數量

如果數量超過目前能開的燈 那ans的上限就會降低 因為我們每分鐘只能開一盞燈 。

 

e.x.

1分鐘的時候有2個持續時間為1的燈 那我們只能選一個開 另一個也不可能之後開 所以到目前為止答案最多 n-1

2分鐘的時候有3盞燈持續時間為2的燈剛好關掉 那我們這一分鐘也只能選一個開 另外兩個同樣直接剔除 答案目前最多會只有 n - 3



 
ZeroJudge Forum