不同的题目在于check函数不同
bool check(int mid) { // 检查 mid 是否可行 } // 这个二分找出的是最大的满足要求的解 // 如果要求最小的不满足要求的解的话 // 把 check 取反就可以了 int binary_search() { int l = 0, r = max_ans; // max_ans 是根据题意得出的最大的可能答案 while (l < r) { int mid = (l + r) >> 1; if (check(mid)) { l = mid + 1; } else { r = mid; } } return r - 1; }
答案是浮点数
const double esp = 1e-8; bool check(double mid) { // 检查 mid 是否可行 } int binary_search() { double l = 0, r = max_ans; // max_ans 是根据题意得出的最大的可能答案 while (fabs(l - r) > eps) { // 或者 for (int i = 0; i < 200; ++i) { double mid = (l + r) / 2; if (check(mid)) { l = mid; } else { r = mid; } } return l; }
lower_bound(a,a+n,x)-a;返回值为在区间【a,a+n】有几个比x小的
upper_bound(a,a+n,x)-a;有几个<=x的