【题目描述】
农夫 John 建造了一座很长的畜栏,它包括N(2≤N≤100,000)个隔间,这些小隔间依次编号为x1,...,xN(0≤xi≤1,000,000,000). 但是,John的C(2≤C≤N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢
【输入】
第一行:空格分隔的两个整数N和C;
第二行---第N+1行:i+1行指出了xi的位置。
【输出】
一个整数,最大的最小值。
【输入样例】
5 3
1 2 8 4 9
【输出样例】
3
【提示】
把牛放在1,4,8这样最小距离是3。
刷这种二分的感觉还是很爽的,但是提交出现运行错误的时候,才发现while循环需要加上i<=n
#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define ll long long
ll a[N], l, r;
int main(){
int n, c;
scanf("%d %d",&n, &c);
for(int i=1; i<=n; i++)
scanf("%lld", &a[i]);
sort(a+1, a+n+1);
r = a[n]-a[1];
while(l < r){
ll mid = l + ((r-l)>>1), res = 0;
for(int i=1; i<=n; i++){
int t = i;
while(a[i+1] - a[t] < mid && i <= n)//会运行超时 所以加上i<=n!
i++;
++res;
}
if(res >= c)
l = mid + 1;
else if(res < c)
r = mid;
}
printf("%lld",l-1);
return 0;
}