[BZOJ1816][CQOI2010]扑克牌

解析

看到 \(n\) 很小, \(C_i\) 很大,多半是二分。

考虑二分牌数,检查 joker 能否补齐其他的缺少部分

const int maxn = 60;

int c[maxn], n, m, l = 0, r = 0x3f3f3f3f, mid;

bool check(int val) {
	int sum = 0;
	forn(i, n) {
		sum += max(val - c[i], 0);
		if (sum > val || sum > m) return 0;
	}
	return 1;
}

int main() {
	read(n), read(m);
	forn(i, n) read(c[i]);
	while (l < r) {
		if (check(mid = (l + r + 1) >> 1)) l = mid; else r = mid - 1;
	}
	printf("%d", l);
}
posted @ 2018-10-06 19:36  AlessandroChen  阅读(147)  评论(0编辑  收藏  举报