这道题我们运用的是一个区间长度的二分查找,我们先将牛棚位置给排序,之后将left赋值为0,right赋值为最远距离,mid为left和right的平均值,之后我们要找所有满足放牛要求距离最小值中的那个最大值,很多人这里有点难理解,具体就是 1 3 8,满足其中的最小距离是2,1 4 8也满足其中的最小距离为3,我们最后就取那个最大的。对于该二分查找,就是我们从mid开始作为一个最小距离,小于这个距离的牛棚就不能放牛,这样我们就可以把其中满足条件的最大值给筛选出来,我们每次要从第一个牛棚开始放牛,如果可以两个牛棚距离大于mid就更新开始牛棚,知道把牛都放下去。对于每次操作如果牛放不满,说明该距离太大,将区间缩短到mid左区间相当于小区间,反之就缩短到大区间。最后输出mid即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;cin>>a>>b;
int r[a];
for(int i=0;i<a;i++)cin>>r[i];
sort(r,r+a);
int left=0;
int right=r[a-1]-r[0];
while(left<=right)
{
int mid=(right+left)/2;
int bb=1;
int op=r[0];
for(int i=1;i<a;i++)
{
if((r[i]-op)>=mid)
{
bb++;
op=r[i];
if(bb>=b)break;
}
}
if(bb>=b)left=mid+1;
else right=mid-1;
}
cout<<(left+right)/2;
}