传送门
本道题目讲的是一个农夫有c头牛和n个隔间,题目会给出每个隔间的位置,因为一个隔间只能装一头牛,所以农夫要给c头牛安排位置,要求任意两头牛的位置的最小值是最大的
解题思路
刚刚看到这个题目的时候,很懵逼,感觉不是很适应,后面就直接去看的题解
题解上是这样说的,二分任意一头牛之间的最小距离,如果满足判断,那么再往更大的值找,如果不满足,那么就往小的值找,听上去好像有点道理哈。emm,判断函数感觉有点绕,自己还说不清楚,后面找时间补
code
#include <iostream>
#include <algorithm>
using namspace std;
int n,c;
int a[100005];
inline int check(int mid)
{
int k=mid+a[0];
int ans=1;
for(int i=1;i<n;i++)
{
if(a[i]>=k)
{
ans++;
k=a[i]+mid;
}
}
if(ans>=c)return 1;//说明最大最小距离大于等于mid
return 0;
}
int main()
{
int i,j,k;
cin>>n>>c;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int l=a[0],r=a[n-1];
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid))l=mid+1;
else r=mid-1;
}
cout<<l-1<<endl;
return 0;
}