[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);
}
原文地址:https://www.cnblogs.com/Alessandro/p/9748185.html