- 题目大意
农夫约翰搭了一间有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; }