[二分答案]HDU4004 The Frog's Games

也不知道怎么回事,这几天遇到好几道二分答案的题,百度之星也有一道二分水题,于是趁此机会再搞了一下二分。

之前写二分都很纠结,不知道二分结束后指向的值是比目标大一个还是小一个,总之特判特判,搞的代码臭长。。

在数列里面二分都用STL的二分函数搞,然后二分答案的就手写,是r-1还是l+1似乎很有讲究啊,可惜我还没研究透彻。

这题没啥可以说的,就一个二分答案的水题,判断当前的MID是否合法用贪心,每次跳到最远就是最优的。

不过注意R范围,还有记得排序,总复杂度贪心O(N),二分O(logL),总复杂度O(N*logL)。

二分效率确实高啊,1e9的范围都不超过二分40次。

贴代码。

#include<cstdio>
#include<algorithm>
using namespace std;
int stn[500005], n, m, rive;
bool ok(int ma){
    int now = stn[0],t = 0;
    for(int i = 1; i <= n+1; t += 1){
        if(stn[i] - now > ma || t >= m) return 0;
        int p = upper_bound(stn, stn+n+2, now+ma) - stn;
        now = stn[p-1];
        i = p;
    }
    return 1;
}
int main(){
    while( scanf("%d%d%d", &rive, &n, &m)!=EOF ){
        for(int i = 1; i <= n; ++i) scanf("%d", &stn[i]);
        sort(stn+1, stn+n+1);
        stn[0] = 0, stn[n+1] = rive;
        int l = 0, r = rive+5, mid;
        while( l < r ){
            mid = (l + r) >> 1;
            if( ok(mid) ) r = mid;
            else l = mid + 1;
        }
        printf("%d\n", l);
    }
}


你可能感兴趣的:(ACM,HDU)