[題解] UVa 1203 - Argus
Tags
- 題解
- UVa
- D難度
略譯
註冊 n 個發信器給你的系統,
每個發信器有一個 id 和一個間隔 t,
表示它每隔 t 秒發出一次訊息;
若是同一秒發出的訊息,以 id 小的先,
問你前 k 個訊息分別是誰發出的
題解
按照題意模擬,會是這樣:
枚舉 1 到 k 去找出第 k 個訊息是誰發出的
而第 i 個訊息,是由這 n 個發信器中,下次發訊時間最小者發出;
- 找出是誰發出訊號
- 決定它的下次發訊時間
- 找出下一個訊息
- …
暴力枚舉是誰的信號,
可以得到複雜度 kn 的做法
進一步優化
仔細觀察,這方法頻繁地在 n 個東西中,找出最小者輸出,讓它變大,
再找出最小者,…
這情況適合使用 heap 來尋找極小值,
於是得到了 k log n 的解決方法
實作提示
- 與其在 heap 中保存一堆數,造成交換時的麻煩,不如只保留 index
- 自刻 heap 的話,可以不需砍掉再加回去,改完時間直接對 head 做 down 整理即可
cmusu