题目描述
Farmer John 建造了一个有 NN(22 \le≤ NN \le≤ 100000100000) 个隔间的牛棚,这些隔间分布在一条直线上,坐标为x1,....xn(0 ≤ xi ≤1000000000)。
他的 C 头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John 想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入格式
第 11 行:两个用空格隔开的数字 N 和 C。
第 22 ~ N+1 行:每行一个整数,表示每个隔间的坐标。
输出格式
输出只有一行,即相邻两头牛最大的最近距离。
输入输出样例
输入 #1
5 3 1 2 8 4 9
输出 #1
3
有N个牛棚时,遍历每一个牛棚。用二分法找最大却适合的距离。如样例
1 2 4 8 9 中当牛在 1 4 9中时,两个相邻的数中最小距离最大为3。复杂度为O(nlong2 n)
#include<iostream>
#include<algorithm>
using namespace std;
int n, c, x[100005];
bool check(int dis) {
int cnt = 1;
int place = 0;
for (int i = 1; i < n; i++) {
if (x[i] - x[place] >= dis) {
cnt++;
place = i;
}
}if (cnt >= c) return true;
else return false;
}
int main() {
cin >> n >> c;
for (int i = 0; i < n; i++) cin >> x[i];
sort(x, x + n);
int left = 0, right = x[n - 1] - x[0];
int ans = 0;
while (left < right) {
int mid = left + (right - left) / 2;
if (check(mid)) {
ans = mid;
left = mid + 1;
}
else
right = mid;
}
cout << ans;
return 0;
}