題目連結:
題目大意:
第一列給定兩正整數 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 值太大了,距離過遠使得隔間不夠用。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。