随着距离的增加 能放下的牛数量肯定来越小
方法一 求能把m头牛都放好的距离最大值
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int w[N];
int n,m;
bool check(int mid)
{
int j=w[0],res=1;
for(int i=1;i<n;i++)
{
if(w[i]-j>=mid)
{
j=w[i];
res++;
}
if(res>=m)return true;
}
return false;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&w[i]);
sort(w,w+n);
int l=0,r=1e9+1;
while(l+1<r)
{
int mid=l+r>>1;
if(check(mid))l=mid;
else r=mid;
}
printf("%d",l);
return 0;
}
方法二 求不能把牛都放好的最小距离
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int w[N];
int n,m;
bool check(int mid) //不能把牛放好就返回true
{
int j=w[0],res=1;
for(int i=1;i<n;i++)
{
if(w[i]-j>=mid)
{
j=w[i];
res++;
}
if(res>=m)return false;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&w[i]);
sort(w,w+n);
int l=0,r=1e9+1;
while(l+1<r)
{
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid;
}
printf("%d",r-1);
return 0;
}