二分模板

来源:互联网 发布:康生书法 知乎 编辑:程序博客网 时间:2024/06/05 02:39
void solve()
{
int lb=0;
int ub=len;
while(lb<=ub)
{
int mid=(lb+ub)/2;
if(check(mid))lb=mid+1;
else ub=mid-1;
}
cout<<lb-1;

}

这里要注意几点

1. lb<=ub  

2.最终答案是mid,也就是lb-1;

3.更换边界的时候要记得加减1


还有一种方法是

while(ub-lb>1)

{

int mid=(lb+ub)/2;

if(check(mid))lb=mid;

else ub=mid;

}

cout<<lb;

但是这种方法不能用来判断端点处的答案

准确的来说是右端点,上面那个方法判断的区间是[l,r);

因为考虑check恒为true,则mid会无限接近ub,当他们的值小于1时,由于计算机的去零取整性,会使得答案为lb

所以上面的上界可以改为  lb=len+1;则区间为[l,r]

原创粉丝点击