POJ 2456 Aggressive cows(二分)

来源:互联网 发布:数据库建立流程图 编辑:程序博客网 时间:2024/05/16 15:00

题目链接:http://poj.org/problem?id=2456

题意:有一排n个牛舍,坐标分别为xi,有m头牛,希望尽可能把他们之间分开,求他们之间最近的两头牛之间的距离最大可以拉到多少。这是二分中最大化最小值的题目,英文的题目又最大又最小有的人不易理解。

思路:显然两头最近的牛的距离太大将没有一种方式安置在牛舍中,两头最近的牛距离越小就越能放置在牛舍中,所以用把答案二分出来,每个mid要模拟放置暴力下可不可以放得下。

//532K188MS#include<cstdio>#include<iostream>#include<algorithm>#define inf 1000001000using namespace std;int n,m;int a[100100];bool ok(int x){    int cnt=1;    int tmp=a[1];    while(cnt!=m){        tmp+=x;        int *p=lower_bound(a+1,a+1+n,tmp); //这里不需要用,只不过练习下这个函数。        if(p==a+1+n) return false;        tmp=*p;        cnt++;    }    return true;}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++){        scanf("%d",&a[i]);    }    sort(a+1,a+n+1);    int lb=0,ub=inf;    while(ub-lb>1){        int mid=(lb+ub)/2;        if(ok(mid)){            lb=mid;        }        else ub=mid;    }    printf("%d\n",lb);    return 0;}


总结一下对于整数二分的模版:

把lb和ub选在有意义的区间之外,然后二分条件是ub-lb>1, mid满足就直接赋给lb(或ub),不满足就直接赋给ub(lb)


0 0
原创粉丝点击