二分
1. 整数二分
1.1 找大于某个数的最小值
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = (l + r) >> 1; // 区别:有无加1
if (check(mid)) r = mid; //区别
else l = mid + 1; //区别
}
return l;
}
1.2 找小于某个数的最大值
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = (l + r + 1) >> 1; // 区别:有无加1
if (check(mid)) l = mid; //区别
else r = mid - 1; //区别
}
return l;
}
2. 浮点数二分
double bin_search(double l, double r)
{
while (r - l > 1e-8) // r与l的间隔小于1e-8
{
double mid = (l + r) / 2; // 不需要考虑加一的事情
if (mid * mid * mid >= n) r = mid;
else l = mid; // r和l都是mid
}
return l;
}