二分答案
对于一类很特殊的问题,例如“最大……最小……”问题、“最小……最大……”问题,我们可以使用二分答案来解决问题。
二分答案是一个非常有意思的解题思路。正常的解题思路是逐步求解然后获得答案,但是二分答案的思路是先假设一个答案,再验证这个答案是否合规,直到找到真正的答案。
二分答案一般分为两个部分:
(1)通过二分法来获得一个假设的答案mid;
(2)对假设出的答案mid进行检查是否合规,可以使用check(mid)来进行规范检查。
下面给出二分答案的模板,如下。
#include <iostream> #include <cstdio> using namespace std; const int MAXN = 100001; const int MAX = (1 << 31) - 1; int c[MAXN]; int ans = MAX, l, r, m, d, n, k; bool check(int now) { int tot = 0; for(int i = 2; i <= n; i++) { tot += (c[i] - c[i - 1] - 1) / now; } return tot <= k; } int main() { scanf("%d%d%d", &d, &n, &k); for(int i = 1; i <= n; i++) { scanf("%d", &c[i]); } l = 0; r = d; while(l <= r) { m = (l + r) / 2; if(check(m)) { r = m - 1; ans = m; } else { l = m + 1; } } printf("%d\n", ans); return 0; }
圆满完成。