也不知道怎么回事,这几天遇到好几道二分答案的题,百度之星也有一道二分水题,于是趁此机会再搞了一下二分。
之前写二分都很纠结,不知道二分结束后指向的值是比目标大一个还是小一个,总之特判特判,搞的代码臭长。。
在数列里面二分都用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); } }