常用思想:枚举一个值,使得剩下的值具有单调性,然后进行二分。

二分答案

参考博客:https://www.cnblogs.com/fenghaoran/p/6391052.html

为什么可以二分答案呢?

如果要求满足条件的最大值,如果我们check了10000,发现它是满足解的,那么答案肯定不小于10000。如果我们又check了20000,发现它是满足解的,那么10000-20000内的数我们都不用枚举。又或者20000是不满足解的,那么答案就在10000-20000的左闭右开区间内。这个时候我们如果”恰当地“check 15000,答案的范围会进一步缩小。

碰到最小/最大有可能是二分答案哦。

求满足条件的最大值
int l=1,r=maxn,ans=0;
while(l<=r)
{
    int mid=(l+r)>>1;
    if(judge(mid))ans=mid,l=mid+1;
    else r=mid-1;
}
求满足条件的最小值
int l=1,r=maxn,ans=0;
while(l<=r)
{
    int mid=(l+r)>>1;
    if(judge(mid))ans=mid,r=mid-1;
    else l=mid+1;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

CodeForces869C 组合数学(或者DP) Previous
51nod 1088 最长回文子串 Next