- 先放模版
int L=-1,R=n;
while(L+1!=R)
{
int mid=L+R>>1;
if(check()) L=mid;
else R=mid;
//最后根据你所分左右两边区间的结果
//选取L或者R作为结果
}
- 模板解释
- 二分的左右边界是L和R,初始时L=-1,R=n
- 二分的终止条件是L+1==R,即L和R相邻
- 二分的中点是mid=L+R>>1
- 二分的判断条件是check(),如果check()为真,说明mid是一个可行解,所以L=mid,否则R=mid
- 二分的最后结果是L或者R,根据你所分左右两边区间的结果选取L或者R作为结果
- 该模版的特点
- 该模版不需要考虑mid+1和mid-1,因为mid+1和mid-1的情况在check()中已经考虑了
- 该模版的二分区间是[L,R),即左闭右开区间,所以最后的结果是L或者R,根据你所分左右两边区间的结果选取L或者R作为结果
可以参考这个网站进行练习