二分答案

  对于一类很特殊的问题,例如“最大……最小……”问题、“最小……最大……”问题,我们可以使用二分答案来解决问题。

  二分答案是一个非常有意思的解题思路。正常的解题思路是逐步求解然后获得答案,但是二分答案的思路是先假设一个答案,再验证这个答案是否合规,直到找到真正的答案。

  二分答案一般分为两个部分:

  (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;
}

 

 

 

  圆满完成。

posted @ 2018-10-10 13:10  potato226  阅读(501)  评论(0编辑  收藏  举报