对于一类很特殊的问题,例如“最大……最小……”问题、“最小……最大……”问题,我们可以使用二分答案来解决问题。
二分答案是一个非常有意思的解题思路。正常的解题思路是逐步求解然后获得答案,但是二分答案的思路是先假设一个答案,再验证这个答案是否合规,直到找到真正的答案。
二分答案一般分为两个部分:
(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;
}
圆满完成。