二分法查找位置
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
int a[100005];
int n,c;
int distan(int d)//二分法查找到合适的距离
{
int pre=0;
for(int i=1;i<c;i++)
{
int now=pre+1;
while(now<n&&a[now]-a[pre]<d)
now++;
if(now==n)return 0;//当最大距离为d的时候并没有把所有奶牛插入,不符合题意
pre=now;//放入了当前的奶牛,位置向后移一位看能否放下下一头奶牛
}
return 1;//奶牛全部安排好,当前的d符合题意
}
int main()
{
while(~scanf("%d%d",&n,&c))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);//第一只牛一定是放在最小的a[i]上
int l=0,r=1e9+5;//a[i]最大为1e9
while(r-l>1)
{
int mid=(l+r)/2;
if(distan(mid))l=mid;//最大距离为mid时符合条件,看能否找到更大的mid
else r=mid;//不符合条件,缩小区间以实现缩小mid的值
}
printf("%d\n",l);//注意输出的是l不是r,因为一直满足l<r,最后一次循环满足条件的是较小的值
}
return 0;
}