- 一本通传送门
- 二分法典型例题,求最小值最大,用二分就行
- 二分+判断可行
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+3;
int n,m,x[N];
bool check(int d){//判断是否可行
int cow=1,rgt=x[1]+d;
for(int i=2;i<=n;i++){
if(x[i]<rgt) continue;//距离小,下一个
++cow;//可行,牛数加一
rgt=x[i]+d;//下一个的位置
}
return cow>=m;//返回值
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>x[i];
sort(x+1,x+n+1);//牛舍位置输入时是无序的,需要排序
int l=0,r=x[n]-x[1];
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)) l=mid+1;//向右二分
else r=mid-1;//向左二分
}
cout<<r<<endl;
return 0;
}