- 将区间 \([l,\ r]\) 划分为 \([l,\ mid]\) 和 \([mid + 1,\ r]\)。
代码:
int bsearch_1(int l, int r){
while (l < r){
int mid = l + r >> 1;
if (chk(mid)) r = mid;
else l = mid + 1;
}
return l;
}
- 将区间 \([l,\ r]\) 划分为 \([l,\ mid - 1]\) 和 \([mid,\ r]\)。
代码:
int bsearch_2(int l, int r){
while (l < r){
int mid = l + r + 1 >> 1; // 防止死循环
if (chk(mid)) l = mid;
else r = mid - 1;
}
return l;
}
- 浮点数的二分
代码:
double bsearch_3(double l, double r){
while(r - l > eps){ // eps 根据题意给的精度要求而定
double mid = l + r >> 1;
if(chk(mid)) l = mid; // 具体根据题意判断
else r = mid;
}
return l;
}
- 三分
代码:
int bsearch_4(int l, int r){
while(l + 1 < r){
int lm = l + r >> 1;
int rm = lm + r >> 1;
if(chk(lm) <= chk(rm)) r = rm; // 看题意而改符合
else l = lm;
}
return l;
}