二分答案入门

二分答案

使用场景

如果答案具有单调性且有范围,那么就可以二分枚举答案,在答案合法的条件下不断逼近最优(如最大值最小或最小值最大),最后一个合法的答案就是最优解,这便是二分答案

板子

整数域上的二分

while(l<=r){
    mid=(l+r)>>1;
    if(check(mid))
        ans=mid,r=mid-1;
   	else
        l=mid+1;
}

最后while结束后,ans便是最后一个合法的答案即最优解
另一种写法:

while(l<r){
    int mid=(l+r)>>1;
    if(check(mid))r=mid;
    else l=mid+1;
}
cout<<l<<endl;

实数域上的二分

while(r-l>eps){
    mid=(l+r)/2;
    if(check(mid))
        l=mid;
    else
        r=mid;
}

eps为精度,一般需要保留k位小数时,esp应取(10^{-(k+2)})

难度递增(本来裸的二分答案都比较简单)

本文采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。

欢迎转载,请注明出处: 转载自:Santiego的博客

原文地址:https://www.cnblogs.com/santiego/p/9562946.html