原题
题目描述:
农夫约翰搭了一间牛棚,有N个牛舍。牛舍排在一条线上,第i号牛舍在xi的位置。但是他的M头牛对小屋不满意,因此经常相互攻击。约翰为了防止牛之间相互伤害,因此决定把每头牛都放在离其他牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离.
解题思路:
1.对牛舍位置从小到大排序。
2.把第一头牛放在 x0 处。
3.把第 i 头牛放在 xj 处的话,第 i+1 头牛就应该放在 大于等于 x0+d 处。( d 为两头牛的距离)
Input
5 3
1 2 8 4 9
Output
3
用二分法枚举 d 的大小,寻求最适合的距离
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100000005;
int a[maxn];
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 r,l,mid;
l = 0;
r = a[n-1]+1;
while(l +1 < r){
int sum = 1;
int mid = (l + r) / 2;
int last = 0;
for(int i = 1;i < n;i++){ // 判断该距离 d 是否能放得下 C 头牛
if(a[i] - a[last] > mid){
sum++; //sum 为距离 d 放下的牛的数量
last = i;
}
}
if(sum < c){ //如果不能够满足 C 头牛的情况
r = mid; //距离减少
}
else{ //如果能满足 C 头牛的情况
l = mid; // 距离增加
}
}
printf("%d\n",r);
return 0;
}