整数二分

要根据题目确定边界的等号是否取到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//check是根据题目定的一个判断方法
public static boolean check(int x) {
/* ... */
}
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
public static int bsearch_1(int l, int r)
{
while (l < r)
{
//>>>表示无符号运算
int mid = l + r >>> 1;
if (check(mid)) r = mid; // check()判断mid是否满足性质
else l = mid + 1;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
public static 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;
}
//总之,具体问题具体分析

浮点数二分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//check是根据题目定的一个判断方法
public static boolean check(int x) {
/* ... */
}
public static double bsearch3(double l, double r) {
//eps表示精度,取决于题目对精度的要求
final double eps = 1e-6;
while (r - l > eps) {
double mid = l + (r - l) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return 1;
}