头像

Cyan

四川成都

深度强化学习炼丹师

信息学竞赛模板(二)— 二分查找

信息学竞赛模板(二)— 二分查找

2021-02-04 · 107次阅读 · 原创 · 数据结构与算法

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 为位小数,则将精度设置为 eps=10(k+2)eps = 10^{-(k+2)}

  • 最小形式
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 协议进行许可