二分算法模板

整数二分

 1 /**\
 2 check()函数用来检查是否具有某种性质
 3 r = mid 适用于答案往左逼近的情况
 4 l = mid 适用于区间答案往右逼近的情况(例如最小最大值)
 5 \**/
 6 int bs1(int l, int r)
 7 {
 8     while (l < r)
 9     {
10         int mid = l + r >> 1;
11         if (check(mid)) r = mid;    
12         else l = mid + 1;
13     }
14     return l;
15 }
16 
17 int bs2(int l, int r)
18 {
19     while (l < r)
20     {
21         int mid = l + r + 1 >> 1;
22         if (check(mid)) l = mid;
23         else r = mid - 1;
24     }
25     return l;
26 }
27 
28 
29 double bs_3(double l, double r)
30 {
31     const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求
32     while (r - l > eps)
33     {
34         double mid = (l + r) / 2;
35         if (check(mid)) r = mid;
36         else l = mid;
37     }
38     return l;
39 }

 

posted @ 2022-03-03 14:49  std&ice  阅读(63)  评论(1编辑  收藏  举报