zoukankan      html  css  js  c++  java
  • POJ 2456 Aggressive cows---二分搜索法

    ///3.最大化最小值
    /**
        POJ 2456 Aggressive cows
        Q:一排牛舍有N (2 <= N <= 100,000) 个,位置为x1,...,xN (0 <= xi <= 1,000,000,000)
        为使牛之间不受到伤害,需最大化他们之间的距离,求最大化最近两头牛之间的距离
        共M只牛
        A:
        条件C(x):可以使得最近两头牛之间的距离不小于d->求满足条件的最大d->如何高效的判断C(x)
    
    */
    #include"iostream"
    #include "cstdio"
    #include "algorithm"
    using namespace std;
    #define MAX 100010
    #define INF 0x3f3f3f3f
    int N,M,x[MAX];
    bool C(int d)
    {
        int last=0;///首位定放牛;看能否找到M-1个牛舍 能够满足之间距离>=d?
        for(int i=1;i<M;i++)
        {
            int crt=last+1;///cnt表示当前牛舍位置下标
            while(crt<N&&x[crt]-x[last]<d)///last表示上一被占牛位舍位置下标,
            {
                crt++;
            }
            if(crt==N)return false;///牛舍不能满足
            last=crt;
        }
        return true;
    }
    void solve()
    {
        int lb=0,ub=INF;
        int mid;
        while(ub-lb>1)
        {
            mid=(lb+ub)/2;
            if(C(mid))///放得下,距离还可以再大点
                lb=mid;
            else    ///放不下了,mid已经不能满足
                ub=mid;
        }
        printf("%d
    ",lb);
    }
    
    int main()
    {
        while(~scanf("%d%d",&N,&M))
        {
            for(int i=0;i<N;i++)
            {
                scanf("%d",&x[i]);
            }
            sort(x,x+N);
            solve();
        }
    }
  • 相关阅读:
    java线程(1)-线程同步
    Scala:(3)数组
    Codeforces 899F Letters Removing
    拼图游戏的可解性
    Hash
    哈夫曼编码
    莫比乌斯
    FFT
    Ropes
    区间合并
  • 原文地址:https://www.cnblogs.com/kimsimple/p/7137305.html
Copyright © 2011-2022 走看看