https://vjudge.net/contest/241402#problem/A
题意:
有n个牛栏,选m个放进牛,相当于一条线段上有 n 个点,选取 m 个点,使得相邻点之间的最小距离值最大
思路:二分枚举相邻两牛的间距,判断大于等于此间距下能否放进所有的牛,具体详见代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,c,a[100005];
int judge(int x) //判断当最小距离是x时,可放入几头牛
{
int i,s=1,p=a[0]; //一定从a[0]取
for(i=1; i<n; i++)
{
if(a[i]-p>=x)
{
s++;//s记录放入几头牛
p=a[i]; //p记录上一个放入牛的房间
}
}
return s;
}
int main()
{
int i,j;
scanf("%d%d",&n,&c);
for(i=0; i<n; i++)
scanf("%d",&a[i]);
sort(a,a+n);int mid;
int low=0,high=a[n-1]-a[0]; //low和high表示可取的距离的上下界,二分查找符合要求的距离
while(high>=low)
{
mid=(low+high)/2;
if(judge(mid)>=c) //如果可放入牛的数目>=c头牛的话,则满足条件,且最小值还可以继续扩大
low=mid+1;
else // 最小值取大了,对左侧区间再进行二分查找。
high=mid-1;
}
printf("%d\n",mid);
return 0;
}