前往
大廳
主題

ZeroJudge - f347: 10154: Weights and Measures 解題心得

Not In My Back Yard | 2020-12-06 00:00:04 | 巴幣 0 | 人氣 375

題目連結:


題目大意:
輸入有若干列(最多 5607 列),每列給定兩整數,分別代表其中一隻烏龜的重量以及可以負荷的總重(包含自己的重量)之力量值。

請做出一個烏龜塔,使得每隻烏龜負載重量不會超過自身的力量值。試問烏龜塔最高可以多高?



範例輸入:
300 1000
1000 1200
200 600
100 101


範例輸出:
3


解題思維:
可以看到至少會有一個最佳解(最高的烏龜塔)是按照著力量值由小到大排的(如果是從烏龜塔頂端往底部看的話)。因為如果有任何一個最佳解不是長這樣的話,則將力量值排序不會影響最佳解的最佳性,仍會是最佳解。

接著假設我們已經知道前 K 隻烏龜最佳的烏龜塔(已經按照力量值排序過)。當第 K + 1 隻烏龜進來(這隻烏龜的力量值不比塔的底端小),如果當前塔的總重加上該隻烏龜後仍小於或等於它的力量值,則這隻烏龜就可以放到最底端將塔的高度 + 1;如果加上去後會超過它的力量值,則把包含此烏龜的塔移掉裡面重量最重的烏龜(因此有可能移掉自己本身)即可。



因此我們可以用一優先佇列(Priority Queue,PQ)來維護這座塔,並且再用一個變數 W 儲存目前塔的總重。首先將每隻烏龜按照力量值由小排到大,接著掃過每隻烏龜。

對於每隻烏龜 T,將 T 的重量先加入 PQ 裡,同時 W 也加上 T 的重量。接著判斷 W 有沒有超過 T 的力量值。如果沒有就沒事,繼續看下一隻烏龜;如果有超過,則將 PQ 中重量最大的移出來並將 W 減去該值。

最後,所求即為 PQ 的大小。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作