Aggressive cows(最大化最小值问题(二分搜索))

来源:互联网 发布:乐视没有mac版 编辑:程序博客网 时间:2024/06/05 16:13

题目来源:http://poj.org/problem?id=2456
【题意】
有n个牛舍放在一维坐标轴的不同位置,把m头牛分别放进不同的牛舍,问,任意两头牛之间最大距离是多少。
【思路】
最大化最小值问题,采用二分搜索,搜索一个最大值,满足可以将这m头牛放进不同的牛舍里,即,若是当前位置是d[pre],而用二分搜索出的一个值是d,那么下一个牛舍next就必须符合d[next]-d[pre]>=d.
【代码】

#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<cmath>#include<iostream>#include<map>#include<queue>using namespace std;typedef long long LL;const int INF=1e9;LL dis[100000+10];int n,m;bool Is(int t){    int pre=0;    for(int i=1;i<m;i++)    {        int next=pre+1;        while(next<n&&dis[next]-dis[pre]<t)        {            next++;        }        if(next==n) return false;        pre=next;    }    return true;}int main(){    while(~scanf("%d%d",&n,&m))    {        for(int i=0;i<n;i++)            scanf("%lld",&dis[i]);        sort(dis,dis+n);        int l=0,r=INF;        while(r-l>1)        {            int mid=(l+r)/2;            if(Is(mid)) l=mid;            else r=mid;        }        printf("%d\n",l);    }}

写法一样的题:http://blog.csdn.net/duan_1998/article/details/64904267
原题链接:http://poj.org/problem?id=1064

0 0