H - Aggressive cows (POJ - 2456)
阿新 • • 發佈:2018-02-15
names out 因此 之間 rt+ 枚舉 i++ 問題 滿足
- 題目大意
農夫約翰搭了一間有n間牛舍的小屋。牛舍排在一條線上第i號牛舍在xi的位置。但是他的m頭牛對小屋很不滿意,因此經常互相攻擊。約翰為了防止牛之間互相傷害,因此決定把每頭牛都放在離其他牛盡可能遠的牛舍。
- 解題思路
很明顯是一個最大值最小化的問題,因此我們可以假設C(d)為滿足所有牛之間的距離都不小於d。先對牛舍的位置排序,然後二分枚舉d,尋找滿足條件的d。
- 代碼
#include<iostream> #include<algorithm> using namespace std; const int MAX = 100001; int n, m; int num[MAX]; bool find(int d) { int last = 0; for (int i = 1; i < m; i++) { int crt = last + 1; while (crt < n&&num[crt] - num[last] < d) { crt++; } if (crt == n) return false; last = crt; } return true; } int main() { cin >> n >> m;; for (int i = 0; i < n; i++) cin >> num[i]; sort(num, num + n); int lb = 0,ub = (num[n-1]-num[0])/(m-1); while(ub-lb>1) { int mid = (lb + ub) / 2; if (find(mid)) lb = mid; else ub = mid; } cout << lb<<endl; return 0; }
H - Aggressive cows (POJ - 2456)