农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这 些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,000,000,均为整数,各不相同).
John的C (2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得 互相打扰。怎样才能使任意两头牛之间的最小距离尽可能的大,这个最 大的最小距离是多少呢
思想:二分,首先把输入的数据进行从小到大排序,再由最短距离为1,最长距离为(a[n-1] - a[0] + 1 - c) / (c - 1) + 1进行二分测试即可
代码:
#include<iostream> #include<algorithm> using namespace std; #define N 100000+5 int a[N]; int main() { int n, c; scanf("%d%d", &n, &c); for(int i = 0; i < n; i++) scanf("%d", &a[i]); sort(a, a+n); int L = 1, R = (a[n-1] - a[0] + 1 - c)/(c-1) + 1; int mid, ans; while(L <= R) { mid = L + (R - L)/2; int i = 1, count = 1, pre = 0; while(i < n && count < c) { while(i < n && a[i] - a[pre] < mid) i++; if(i < n) count++; pre = i; i++; } if(count < c) { R = mid - 1; } else { ans = mid; L = mid + 1; } } printf("%d\n", ans); return 0; }