常用思想:枚举一个值,使得剩下的值具有单调性,然后进行二分。
二分答案
参考博客: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 协议 ,转载请注明出处!