进击的奶牛
题目描述
Farmer John 建造了一个有
N
N
N(
2
2
2
≤
\le
≤
N
N
N
≤
\le
≤
100000
100000
100000) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是
x
1
x_1
x1 ,…,
x
N
x_N
xN
(0
≤
\le
≤
x
i
x_i
xi
≤
\le
≤
1000000000
1000000000
1000000000)。
他的 C C C( 2 2 2 ≤ \le ≤ C C C ≤ \le ≤ N N N) 头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John 想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入格式
第 1 1 1 行:两个用空格隔开的数字 N N N 和 C C C。
第 2 2 2 ~ N + 1 N+1 N+1 行:每行一个整数,表示每个隔间的坐标。
输出格式
输出只有一行,即相邻两头牛最大的最近距离。
样例 #1
样例输入 #1
5 3
1
2
8
4
9
样例输出 #1
3
思路: 二分答案,答案范围在1~10^10之间,每次二分后判断在当前答案下能存在几头牛,牛的数量大于C则调整二分下界,小于C则调整上界
代码:
#include <bits/stdc++.h>
using namespace std;
int a[100005];
int main(){
int n, c, ans = -1;
cin >> n >> c;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
sort(a + 1, a + n + 1);
int st = a[1], ed = a[n];
while(st <= ed){
int mid = (st + ed) / 2, room = 1, i = 1, j = 2;
while(j <= n){
if(a[j] - a[i] >= mid) room++, i = j, j++;
else j++;
}
if(room >= c) st = mid + 1, ans = mid;
else ed = mid - 1;
}
cout << ans;
return 0;
}