描述
凯亚建造了一个有N(2<=N<=100,000)个隔间的养猪场,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。
他的C(2<=C<=N)头猪不满于隔间的位置分布,它们为猪圈里其他的猪的存在而愤怒。为了防止猪之间的互相打斗,凯亚想把这些猪安置在指定的隔间,所有猪中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入
第1行:两个用空格隔开的数字N和C。
第2行:N个整数,表示每个隔间的坐标。
输出
输出只有一行,即相邻两头猪最大的最近距离。
输入样例 1
5 3 1 2 8 4 9
输出样例 1
3
思路:样例为例。猪圈排序后。可以看出两个猪之间的距离范围为1~8.接下来就要二分缩小范围。
mid = 4.第一头猪肯定要放第一个隔间。
比较第二个隔间和第一头猪的距离,差值小于mid,不能放。比较第三个隔间和第一头猪的位置,差值小于mid,不能放。比较第四个隔间和第一头猪的位置,差值>mid.可以放,放第二头猪。比较第五个隔间与第二头猪的距离,差值小于mid,不能放。所以总归才放2头猪,说明距离如果为4就太大了,放不下三头猪。
那范围就在1~3之间。
mid = 2.第一头猪肯定要放第一个隔间。
比较第二个隔间和第一头猪的距离,差值小于mid,不能放。比较第三个隔间和第一头猪的位置,差值>mid,可以放,放第二头猪。比较第四个隔间和第二头猪的位置,差值>mid.可以放,放第三头猪。比较第五个隔间与第三头猪的距离,差值小于mid,不能放。所以总共能放3头猪,说明距离为2的话是可以的,
那现在知道最大的范围应该出现在3~3了。
mid = 3.第一头猪放第一个隔间。
比较第二个隔间和第一头猪的距离,差值小于mid,不能放。比较第三个隔间和第一头猪的位置,差值==mid,可以放,放第二头猪。比较第四个隔间和第二头猪的位置,差值>mid.可以放,放第三头猪。比较第五个隔间与第三头猪的距离,差值小于mid,不能放。所以总共能放3头猪,说明距离为3的话是可以的。
接下来left+1>right.
所以最后left == right =3的。所以最大的距离就是3.
程序如下:
#include<iostream>
#include<algorithm>
using namespace std;
int a[100011];
int n,c;
int check(int x){
int cnt=1,last=a[1];
for(int i=2;i<=n;i++){
if(a[i]-last>=x){
cnt++;
last=a[i];
}
}
if(cnt>=c)
return 1;
else
return 0;
}
int main(){
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
int left=1,right=a[n]-a[1];
int mid;
while(left<=right){
mid=(left+right)/2;
if(check(mid)) left=mid+1;
else right=mid-1;
}
cout<<right;
return 0;
}