题目描述
Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,…,xN (0<=xi<=1,000,000,000)。
他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入格式
第1行:两个用空格隔开的数字N和C。
第2~N+1行:每行一个整数,表示每个隔间的坐标。
输出格式
输出只有一行,即相邻两头牛最大的最近距离。
输入输出样例
输入 #1
5 3
1
2
8
4
9
输出 #1
3
实现代码
#include<iostream>
#include<algorithm>
#define ll unsigned long long int
#define N 100000+5
using namespace std;
ll point[N];
ll n, c, mid, l, r, max_ignore;
bool check(int dis) {
ll count = 0;
ll l = point[0];
for (ll i = 1; i < n; i++) {
if (dis + l > point[i]) {
if (++count > max_ignore) return false;
}
else {
l = point[i];
}
}
return true;
}
int main() {
cin >> n >> c;
for (ll i = 0; i < n; i++) {
cin >> point[i];
}
sort(point, point + n);
l = point[0];
r = point[n - 1];
max_ignore = n - c;
while (l + 1 < r) {
mid = (l + r) / 2;
if (check(mid)) l = mid; //说明此距离不会越界,是最优解的左值
else r = mid;
}
if (check(r)) cout << r << endl; //测试大的先,因为答案要求最大解
else cout << l << endl;
return 0;
}