SSL-ZYC 愤怒的牛
题目大意:
Farmer John建造了一个有N个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,…,xN 。他的C头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
一道二分的题目。
用z来表示两头牛最多相隔的距离,每次二分出z后,从第一个隔间开始枚举,如果第i个隔间与上一头牛所在的隔间的距离大于等于z,sum就加1。最终判断sum是否大于等于c,若大于等于c,l=z,否则r=z-1。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int l,r,z,a[100001],n,m,k,sum,ok,left,right;
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1); //排序牛棚的位置
l=0;
r=a[n];
while (l!=left||r!=right) //二分
{
left=l;
right=r;
z=(l+r)/2+1; //求中间数
k=a[1]+z;
sum=1;
ok=0;
for (int i=2;i<=n;i++) //枚举每一个牛棚
{
if (a[i]>=k) //如果可以放
{
sum++; //计数
k=a[i]+z;
if (sum>=m) //如果每次间隔z的条件是成立的
{
ok=1;
break; //退出循环
}
}
}
if (ok==1) l=z;
else r=z-1;
}
printf("%d\n",l); //输出答案
return 0;
}