POJ2456 二分搜索

POJ2456 Aggressive cows
题意:有N间牛舍,牛舍被排在一条线上,第i号牛舍在xi的位置。但是他的M头牛对小屋很不满意,因此经产互相攻击。为了防止牛之间互相伤害,因此决定把每头牛都放在离其他牛尽量远的牛舍。也就是要最大化最近的两头牛之间的距离。
关于最小值最大化或者最大值最小化的问题,通常用二分搜索法

#include<cstdio>
#include<algorithm>
using namespace std;
int a[100002];
int n,m;
bool Ok(int mid){
    int last=1;//第一头牛放入第一个牛舍
    for(int i=2;i<=m;i++){//last指上一个牛舍的位置
        int cur=last+1;//cur是当前的牛舍位置
        while(cur<=n&&a[cur]-a[last]<mid)cur++;//遍历牛舍,前后两个牛舍距离>=mid时可以放下
        if(cur>n)return 0;//如果是剩下所有牛舍与上一个牛舍距离都<mid,那么说明这个mid取大了,要重新选mid
        last=cur;//可以放下的时候把第i头牛放在第cur个牛舍里,更新last,继续往下找
    }
    return 1;
}
int main(){
    scanf("%d%d",&n,&m);//n个牛舍m头牛
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+1+n);//从小到大排序
    int l=0,r=a[n]-a[1];
    while(l<=r){//二分搜索
        int mid=(l+r)/2;
        if(Ok(mid))l=mid+1;//mid可行,增大mid看能否满足
        else r=mid-1;//mid太大了,要减小
    }
    printf("%d\n",l-1);
    return 0;
}

你可能感兴趣的:(POJ2456 二分搜索)