template
boolean check(int x){
//检查x是否满足某种性质
return true;
}
//整数二分1
//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用
//(寻找满足某种性质的最大点时使用)
int bseach_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,r]被划分成[l,mid-1]和[mid,r]时使用
//(寻找满足某种性质的最小点时使用)
int bsearch_2(int l, int r) {
while (l < r) {
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
//浮点数二分
boolean check(double x) {
//检查x是否满足某种性质
return true;
}
double bsearch(double l, double r) {
const double eps = 1e-6; // eps 表示精度,若题目要求保留n位小数,则取1e-(n+2)
while(l - r < eps) {
double mid = (l + r)/2;
if(check(mid)) r = mid;
else l = mid;
}
return l;
}
Algorithm idea
left border l, right border r
Integer dichotomy 1: mid = (l + r)/2
Integer dichotomy 2: mid = (l+ r + 1)/2 //When l=r-1, if check(mid)=true, an infinite loop occurs, adding more 1 can avoid the infinite loop
Floating point dichotomy: mid = (l + r)/2
example
(1)
(2)