写在最前面:
此系列中的所有模板全为大佬所写,我只是一个搬运工(?)。
记录:
最开始的时候我以为二分就是单纯的二分(懂得都懂),后来发现是我想太多-_-。
好了,言归正传。
二分,顾名思义,就是把一个区间分为两段,把需要的一段留下,不需要的一段舍去,然后递归求解,直到区间小到只容得下一个数即可(浮点数二分可以让区间的差小于1e-6或者更小)。二分一定会有一个解,最后的解是l=r时候的结果。
二分大概有两种情况,一种是所取区间在前半,而且中间值可取;另一种是所在区间在后半,且中间值可取。第二种情况在去中间值的时候需要注意,在取mid的时候应该在l+r之后+1,否则将会造成死循环。
举个例子:
在1,2中二分求2,如果选择不进行+1,那么在计算过程中mid=1,(mid向下取整),check为mid<2,判断成立,所以l=1,和之前相同,所以陷入了死循环。
关于check函数:
看题目要求,如果短点的话直接在if条件里面概括就行。我个人认为写int函数和bool函数(ture/false)最后的结果应该是差不多的。不过bool还是用的比较多的。
下面是模板:
#include <iostream>
using namespace std;
int check(int mid)//此处为随便定义
{
if(mid>0)
return 1;
else return 0;
}
int bsearch1(int l,int r)//调整边界二分搜索
{
while (l<r)
{
int mid=(l+r)>>1;
if(check(mid))//check根据题意来定
r=mid;//mid可能取到右边界,要哪边哪边在true里面,另外一边改动
else l=mid+1;
}
return l;
}
int bsearch2(int l,int r)
{
while (l<r)
{
int mid=(l+r+1)>>1;
if(check(mid))
l=mid;//mid可能取到左边界
else r=mid-1;
}
return l;
}