算法-二分
时间复杂度(logn)
当问题的答案具有单调性时,就可以通过二分把求解转换为判定。
1.整数二分
bool check(int x){...} //检查x是否满足某种性质
int bsearch_1(int l,int r)
{
int mid=(l+r)>>1;
int ans=r;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
return ans;
}
int bsearch_2(int l,int r)
{
int mid=(l+r)>>1;
int ans=r;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
return ans;
}
2.浮点数二分
bool check(double x) {...} // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}