切換
舊版
前往
大廳
主題

ZeroJudge - e616: Aggressive cows 解題心得

Not In My Back Yard | 2020-09-15 22:20:29 | 巴幣 2 | 人氣 245

題目連結:


題目大意:
第一列給定兩正整數 N 、 C (2 ≦ C ≦ N ≦ 100000),代表有 N 間隔間並有 C 隻牛要放入這 N 個隔間裡。接著有 N 列輸入,每列給定一非負整數 X (0 ≦ X ≦ 1000000000),代表 N 個隔間的位置。

試問在最佳的牛隻位置安排下,牛隻的相鄰間距的最小值其最大可以為何?



範例輸入:
5 3
1
2
8
4
9


範例輸出:
3


解題思維:
運用這題的思維——二分搜尋答案,來找到最大的最小值。

因此我們會有一個下界 L (一開始為 0)以及一個上界 U (一開始為最大的 X 與最小的 X 之差 + 1),每次就是求 M = (L + U) ÷ 2 取商。這個 M 值就是我們二分的關鍵。

如果 M 是一個合適的距離最小值,則將 L 更新成為 M;反之,在怎麼塞牛隻到隔間裡都不可能小過 M ,則將 U 更新為 M 。最後當 U - L ≦ 1 時,L 即是所求。



那要怎麼判斷一個最小距離 M 值是否可行呢?很簡單,就是直接放放看每一隻牛。第一隻牛直接放到 X1 (假設所有隔間的 X 值由小排到大並命名為 X1 、 X2 —— 、XN )。

然後其後每一隻牛要與上一隻牛隔至少 M 個距離,才能放該隻牛。也就是紀錄前一隻牛的位置 XL,然後一直往下一個隔間看 XL+1 - XL 、XL+2 - XL ……,當有 XL+i - XL ≧ M 時(i > 0),該牛就直接放在 XL+i 這個位置。

如果每一隻牛都成功安排到一個隔間,則這個 M 值可行(儘管不一定真的是此次安排的距離最小值);如果隔間先掃完了,但是牛隻還有剩,則代表這個 M 值太大了,距離過遠使得隔間不夠用。




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

創作回應

心彩
想問第8行 int last = -(1 << 30) 為什麼要這樣設? 範例測資的3 要怎麼算出來?
2022-11-25 11:25:48
Not In My Back Yard
last 是「上一隻牛所在的位置」,而對於第一隻牛來說牠並沒有「上一隻」,所以把位置設為「負無限大」。只是因為實際上沒有負無限大,所以設了一個很「負」的數值,也就是 -(1 << 30)。

其中「<<」代表位元左移,在這邊你可以當作「乘以 2」,而「<< 30」代表左移 30 次,所以 1 << 30 代表著 2 ^ 30。
2022-11-25 18:15:24
Not In My Back Yard
更正:「上一個隔間」才對,用「牛」會有點混淆。
2022-11-25 18:19:14
Not In My Back Yard
然後我發現我下半部分的下標跑掉了,所以重新調整了一下。

現在你應該可以自行套套看範例測資了,例如說 M ≦ 2 的時候會怎樣?M ≧ 3 的時候又會怎樣?多代幾個例子應該可以看出一些規律。
2022-11-25 18:23:24
心彩
我以為邊界是從0開始 第一個隔間放不了牛
2022-11-25 18:42:14
Not In My Back Yard
第一個隔間的左側(數線左側往「負」的方向)沒有隔間,所以當然可以先放一隻牛。

重點是接下來的隔間,我們下一個要放牛的隔間需要與前一個放牛的隔間離至少 M 單位才能放。
2022-11-25 19:11:27
心彩
所以他的牛隻的相鄰間距 左右邊界是無限寬廣的?
2022-11-26 00:13:27
Not In My Back Yard
雖然不是很清楚你實際上想問什麼,但對於這個問題的答案是「是否無限沒差,只是假設無限比較好寫」。

正如上面所說的第一個隔間左側根本沒有隔間,而我們在乎的是兩兩隔間「之間的距離」,所以第一個隔間往左不會有「相鄰」者;同理最後一個隔間往右也不會有「相鄰」的隔間存在。
2022-11-26 00:55:40
Not In My Back Yard
所以在文字說明方面就是第一隻就直接放到第一個隔間,然後我們找到「下一個」隔間與「前一個」距離 M 單位以上才放下一隻牛。如果我們能放完所有牛,則代表這個距離值是可行的;反之則不行。

而程式碼裡面有設一個「-(1 << 30)」(即 -2 ^ 30)只是方便而已,因為這樣可以不用額外判斷現在要放的牛是不是第一隻牛。
2022-11-26 00:59:28
心彩
抱歉 我大概知道自己思考的盲點了 我把隔間想成是檔板了 所以才會執著在第一隻牛的可活動範圍 謝謝你的解釋
2022-11-26 07:27:39
Not In My Back Yard
不客氣,很高興可以幫上忙。

有其他問題(包含其他題目)也可以再問。
2022-11-26 13:38:57

更多創作