题目大意:有n个牛棚,先将m头牛分别分进不同的牛棚里,假设这些牛凉凉间的最小距离为K,求k的最大值
思路:最小值最大化问题。。。。先对位置排序,对k不断二分枚举其最大值。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int A[100010],n,m;
bool f(int a){ //检查函数,当前判断当前最小值是否满足条件
int sum,last,i;
last=A[1];
sum=1;
for(i=2;i<=n;i++){
if(A[i]-last>=a){
sum++;
last=A[i];
}
}
if(sum>=m) return true;
else return false;
}
int main(){
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&A[i]);
sort(A+1,A+n+1);
int l=0,r=A[n]-A[1],mid;
while(r>l+1){ //二分确定上界和下界
mid=(l+r)/2;
if(f(mid)) l=mid;
else r=mid;
}
cout<<l<<endl;
return 0;
}