有n间牛舍与m头小牛,牛舍的位置为xi,m头小牛经常相互攻击,求最大化两头牛的距离
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAXN 102400
int n, m;
int x[MAXN];
bool Judge (int d) { //假设最近的两头小牛的距离为d,求是否每头小牛都能分配到牛舍
int last = 0, next;
for (int i = 1; i < m; i ++) {
next = last + 1; //next为第i头小牛的牛舍号(i从0到n-1)
while (next < n && x[next] - x[last] < d)
next ++; //如果两头小牛的牛舍距离小于d,则牛舍号加1
if (next == n) //牛舍号不满足小于n,即距离d过大
return false;
last = next;
}
return true;
}
int main () {
//freopen ("in.txt", "r", stdin);
while (~scanf ("%d%d", &n, &m)) {
for (int i = 0; i < n; i ++) {
scanf ("%d", &x[i]);
}
sort(x, x + n); //按牛舍位置从小到大排序
int start = 1, mid, end = x[n - 1] - x[0];//start,end分别等于两头牛的最小距离和最大距离
while (end - start > 1) {
mid = (start + end)>>1;
if (Judge (mid))
start = mid;
else
end = mid;
}
printf ("%d\n", start);
}
return 0;
}