1 整数形式
- 满足条件的最小值,左端点,取不到
r
的值。
while(l < r){
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
注: 还可以使用lower_bound
代替。
- 满足条件的最大值,右端点,取不到
l
的值。
while(l < r){
int mid = l + r + 1 >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
2 实数形式
2.1 明确精度
若要求保留 k
为位小数,则将精度设置为 。
- 最小形式
while(l + eps < r){ //eps = 10^-(k+2)
double mid = (l + r) / 2;
if(check(mid)) r = mid;
else l = mid;
}
- 最大形式
while(l + eps < r){ //eps = 10^-(k+2)
double mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
2.2 精度不确定
直接循环100次。
- 最小形式
for(int i = 0; i < 100; i ++){
double mid = (l + r) / 2;
if(check(mid)) r = mid;
else l = mid;
}
- 最大形式
for(int i = 0; i < 100; i ++){
double mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
标题: | 信息学竞赛模板(二)— 二分查找 |
---|---|
链接: | https://www.fightingok.cn/detail/42 |
更新: | 2022-09-18 22:33:47 |
版权: | 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可 |