POJ 2456 Aggressive cows

来源:互联网 发布:软件视频会议系统 编辑:程序博客网 时间:2024/05/18 00:13

题意:john有n间牛舍,给出每个牛舍的位置。有M头牛需要安排在这些牛舍里。john希望让每头牛之间的距离尽可能大,防止他们打架。求出最大的距离。

思路:定义: C(d) = 可以安排牛的位置使最近的两头牛的距离不小于d。那问题就变成了满足C(d)的最大的d。

           我们可以通过二分法去求距离,再判断这个距离是否可行。如果可行,增加距离。如果不行,减少距离

           对上述定义进行变形:C(d) = 可以安排牛的位置使任意的牛的间距不小于d.。这个问题的判断就能用贪心法解决。

代码如下:


#include <cstdio>#include <algorithm>using namespace std;template <class T>inline bool read(T &n){    T signal = 1,x = 0;    char ch = getchar();    while((ch < '0' || ch >'9') && ch != EOF && ch != '-')        ch = getchar();    if(ch == EOF)        return false;    if(ch == '-')        signal = -1,ch = getchar();    while(ch >= '0' && ch <= '9'){        x *= 10;        x += ch -'0';        ch = getchar();    }    n = signal * x;    return true;}const int MAX = 100010;const int INF = 0x3f3f3f3f;int N,C;int x[MAX];bool judge(int d){    int now = 0;    int next = 1;    for(int i = 1; i < C; ++i){        next = now + 1;        while(next < N && x[next] < x[now] + d) next++;        if(next == N) return false;        now = next;    }    return true;}int main(void){    read(N),read(C);    for(int i = 0 ; i < N ; ++i)        read(x[i]);    sort(x,x+N);    int ub = INF, lb = 0;    while(lb + 1 < ub){        int mid = (lb + ub) / 2;        if(judge(mid)) lb = mid;        else ub = mid;    }    printf("%d\n",lb);    return 0;}

0 0
原创粉丝点击