整数二分+浮点二分
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整数二分+浮点二分相关的知识,希望对你有一定的参考价值。
整数二分
版本一:
右边是check返回为正的区间,最终的结果为右边区间的最左端的值。
while(l<r)
{
int mid = (l+r)>>1;
if(check(mid)) r = mid;
else l = mid + 1;
}
版本二:
左边是check返回为正的区间,最终的结果为左边区间的最右端的值。
while(l<r)
{
int mid = (l+r+1)>>1;
if(a[mid]<=num) l = mid;
else r = mid-1;
}
注意:
mid的值为(l+r+1)>>1 ,必须加一。
因为如果不加一,可能有一种情况,当r = l + 1时,而check(l)刚好为真,之后取中值为mid = l + r >>1,为下取整,mid还为l,之后就会有死循环。
浮点二分
版本一:
while(r-l>=1e-8)
{
double mid = (l+r)/2;
if(check(mid)) r = mid;
else l = mid;
}
版本二:
让二分有限固定次数
for(int i=1;i<=100;i++)
{
double mid = (l+r)/2;
if(check(mid)) r = mid;
else l = mid;
}
因为为浮点二分,不再对r或l的值更新进行加一减一的操作
以上是关于整数二分+浮点二分的主要内容,如果未能解决你的问题,请参考以下文章