POJ 2456 Aggressive cows(二分)

来源:互联网 发布:广东crm软件 编辑:程序博客网 时间:2024/06/05 11:33

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

题目大意:有n个牛栏,m头牛,将牛放入栏中,要使它们的最小距离尽可能大,输出这个最小距离。

二分搜索。

#include<cstdio>#include<iostream>#include<sstream>#include<cstdlib>#include<cstring>#include<string>#include<climits>#include<cmath>#include<algorithm>#include<queue>#include<vector>#include<stack>#include<set>#include<map>using namespace std;const int N=1e5+5;int n,m;int a[N];//栏位置的坐标bool judge(int x){    int sum=1;//放第一头牛    int situ=a[0];//第一头牛一定要放在第一个栏才能充分利用间隔长度    for(int i=1; i<n; i++)        if(situ+x<=a[i])//现处的位置加上间隔若小于下个位置的坐标,则可行        {            situ=a[i];            sum++;        }    if(sum>=m)//能放下m头牛        return 1;    else        return 0;}int main(){    while(~scanf("%d%d",&n,&m))    {        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        sort(a,a+n);//先从小到大进行排序        int l=0x3f3f3f3f;        for(int i=1; i<n; i++)            l=min(l,a[i]-a[i-1]);//左边界就是所有间隔中的最小值        int r=(a[n-1]-a[0])/(m-1);//因为要输出的结果是最小间隔,因此最大的可能都是当把m个牛放进去后,间隔的平均值        int result;        while(l<=r)//典型二分        {            int mid=(l+r)/2;            if(judge(mid))//若为真,表明这个间隔可以放下所有的牛            {                result=mid;                l=mid+1;//因为题目要求最小间隔尽可能大,因此再试着增大间隔            }            else                r=mid-1;//判断为假。说明间隔取大了,要减小        }        printf("%d\n",result);    }    return 0;}


0 0