SSLZYC 愤怒的牛

题目大意:
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;
}
原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313108.html