題目連結(jié):
題目大意:
第一列給定兩正整數(shù) N 、 C (2 ≦ C ≦ N ≦ 100000),代表有 N 間隔間並有 C 隻牛要放入這 N 個(gè)隔間裡。接著有 N 列輸入,每列給定一非負(fù)整數(shù) X (0 ≦ X ≦ 1000000000),代表 N 個(gè)隔間的位置。
試問(wèn)在最佳的牛隻位置安排下,牛隻的相鄰間距的最小值其最大可以為何?
範(fàn)例輸入:
5 3
1
2
8
4
9
範(fàn)例輸出:
3
解題思維:
運(yùn)用
這題的思維——二分搜尋答案,來(lái)找到最大的最小值。
因此我們會(huì)有一個(gè)下界 L (一開(kāi)始為 0)以及一個(gè)上界 U (一開(kāi)始為最大的 X 與最小的 X 之差 + 1),每次就是求 M = (L + U) ÷ 2 取商。這個(gè) M 值就是我們二分的關(guān)鍵。
如果 M 是一個(gè)合適的距離最小值,則將 L 更新成為 M;反之,在怎麼塞牛隻到隔間裡都不可能小過(guò) M ,則將 U 更新為 M 。最後當(dāng) U - L ≦ 1 時(shí),L 即是所求。
那要怎麼判斷一個(gè)最小距離 M 值是否可行呢?很簡(jiǎn)單,就是直接放放看每一隻牛。第一隻牛直接放到 X1 (假設(shè)所有隔間的 X 值由小排到大並命名為 X1 、 X2 —— 、XN )。
然後其後每一隻牛要與上一隻牛隔至少 M 個(gè)距離,才能放該隻牛。也就是紀(jì)錄前一隻牛的位置 XL,然後一直往下一個(gè)隔間看 XL+1 - XL 、XL+2 - XL ……,當(dāng)有 XL+i - XL ≧ M 時(shí)(i > 0),該牛就直接放在 XL+i 這個(gè)位置。
如果每一隻牛都成功安排到一個(gè)隔間,則這個(gè) M 值可行(儘管不一定真的是此次安排的距離最小值);如果隔間先掃完了,但是牛隻還有剩,則代表這個(gè) M 值太大了,距離過(guò)遠(yuǎn)使得隔間不夠用。
此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說(shuō)明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。