前往
大廳
主題

ZeroJudge - f832: 隕石 (Meteorite) 解題心得

Not In My Back Yard | 2021-05-15 00:00:11 | 巴幣 1000 | 人氣 348

題目連結:


題目大意:
輸入第一列給定兩正整數 N 、 M (1 ≦ N 、 M ≦ 10 ^ 5),代表有 N 顆隕石以及 M 個捕捉器。

接著的一列給定 N 個正整數,代表每顆隕石的大小(介於 1 ~ 10 ^ 9 之間)。

最後一列給定 M 個正整數,代表每個捕捉器所能抓的最大隕石之大小(介於 1 ~ 10 ^ 9 之間)。

試問可以抓到的隕石總大小最大為何(答案可能會超過 32 位元有號整數之範圍)?



範例輸入:
範例輸入 #1
4 3
23 45 67 99
46 67 100

範例輸入 #2
4 4
1 8 5 7
1 9 6 6


範例輸出:
範例輸出 #1
211

範例輸出 #2
14


解題思維:
套用貪心演算法(Greedy Algorithm)的精神即可——將可以抓到的隕石大小最大的捕捉器去抓小於等於它的負荷之隕石、將可以抓到的隕石大小次大的捕捉器去抓剩下的隕石中小於等於它的負荷之隕石、……以此類推。

換句話說,大的捕捉器配上大的隕石,小的捕捉器配小的隕石。

至於為何可行呢?那是因為如果我們使用次大的捕捉器去抓最大的隕石,則大的捕捉器就只能抓較小的隕石。

因為最大的捕捉器此時為大材小用,而且次大的捕捉器還不一定可以抓到最大的隕石。因此這樣不會比我們的策略好(意即我們的策略即是最佳解之一)。



所以我們可以將隕石以及捕捉器大小由大到小排列,然後從最大的隕石以及最大的捕捉器開始試試看可不可以用該捕捉器抓到該隕石。

當目前的捕捉器的大小小於目前隕石的大小時,我們便跳過該隕石到下一個隕石(大小較小);如果捕捉器大小大於等於隕石大小,則我們可以成功地捕捉該隕石。

重複以上過程直到隕石或是捕捉器其中一者沒了為止。

而所求即是上述過程中可以抓到的隕石大小之總和。




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

創作回應

更多創作