切換
舊版
前往
大廳
主題

ZeroJudge - e464: 士兵監視 解題心得

Not In My Back Yard | 2019-10-16 18:54:31 | 巴幣 2 | 人氣 174

題目連結:


題目大意:
給定兩正整數 R 、 n (R = n = -1 時,代表輸入結束),代表有 n 位站在一維標準數線上的士兵,且有一種半徑為 R 的監控用石頭。

接著的一列給定 n 個正整數,代表這 n 位士兵所站的位置之座標。

現在要在某些士兵站的位置放監控用的石頭,好讓士兵們可被監控。求最少需要放幾顆石頭,便可以監控到所有士兵?



範例輸入:
5 7
15 20 33 6 18 30 20
0 3
20 10 20
-1 -1


範例輸出:
3
2


解題思維:
首先將輸入進來 n 位士兵的位置,由小排到大(由大到小也可以,總之需要排序)。接著就是要考慮怎麼放石頭比較好。

因為,石頭只能放在士兵有站的位置,因此可以輕易地用貪心演算法的精神去放那些石頭——即每次放石頭都讓該顆石頭盡可能地覆蓋盡量多的士兵。

以範例輸入第一筆為例,排序後的數列為:
6 15 18 20 20 30 33
因此第一顆石頭,應該放在 6 的位置。因為若放在 15 就管不到 6 。
第二顆應放在 20 (第二個 20)的位置,因為就可以監控到 15 、18 、 20 、 20 四個位置。
第三顆就放在 33 的位置,因為可以控到 30 、 33 。

其他情況以此類推。寫成實際的作法,會比較像是:讓石頭盡量往右,等到左邊有士兵不會被蓋到的時候,前一個位置就是適合的位置。

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

創作回應

更多創作