一·整数二分
根据check方向得到第一个>=或者<=目标的数
1.区间被分成[l,mid]和[mid+1,r]
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
2.区间分成[l,mid-1]和[mid,r]
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r +1>> 1;//注意+1,当l=r-1时不+1会进入死循环
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
二·浮点数二分
相比整数二分,没有+1 -1的烦恼
给定一个浮点数 n,求它的三次方根。(要求保留x位,则r-l到n+2位)
#include<iostream>
#include<algorithm>
using namespace std;
double n;
int main()
{
cin >> n;
double l = -10000, r = 10000;
while (r-l>1e-8)
{
double mid = (l + r )/ 2;
if (mid * mid * mid >= n) r = mid;
else l = mid ;
}
printf("%lf", l);
return 0;
}