首先考虑二分答案。接下来考虑问题:在已知情况下,能不能使用给出的巧克力拼接出 个 child
。
下面分别将四个巧克力定义为 I, L, C, T
型。
对于 i
和 l
,显然只能用 I
型巧克力拼接,所以直接减去 。
接下来考虑 chd
三个字符。有一个一眼看上去很显然的事实:贪心选取 C
或者 T
型一定会更优,因为这样可以节省对 I
和 L
的占用。然而,在实际情况下会有这样的例外:
- 在拼接某个形状的时候,本来可以用两个
L
和一个I
搞定,但是用了一个T
后就只能用两个I
拼接。在这个情况下,引入C
或者T
型会增加对I
的负担。
但是在这一题中,出于特殊性质,这个情况是不会发生的。也就是说,C
型和 T
型的使用必然会减少负担。这一点不妨自行手操一下。
然后就是决策了。首先,C
型和 T
型中,只有 C
型可以放在 c
上,而二者都可以放在 hd
两个字母上。所以考虑先将 C
型安排到 c
上,然后两者看成一类,共同放进 hd
两个字母中。
剩下的就是对 I
和 L
的处理了。此时还剩下被填充了一部分或者没有被填充的 chd
三个字母,分别计算每个形状可以消耗多少 L
型,最后看看万能的 I
型够不够用就好了!
int a, b, c, d;
bool check (int s) {
int _a = a, _b = b, _c = c, _d = d;
_a -= 3 * s;
int p1 = s, p2 = s, p3 = s;
if (_d <= s)
p3 -= _d;
else
p3 = 0, _b += _d - s;
if (_b <= s)
p2 -= _b;
else
p2 -= s, p1 = max(0, p1 - _b + s);
int O = (s - p1) + p1 * 2 + p2 + p3;
int P = (s - p1) * 2 + p1 * 5 + (s - p2) * 1 + p2 * 4 + p3 * 3;
O = min(O, _c);
P -= O * 2;
return _a - P >= 0;
}
int main() {
multiCase() {
cin >> a >> b >> c >> d;
int l = 0, r = 1e4 + 10, m;
while (l < r - 1) {
m = (l + r) >> 1;
if (check(m))
l = m;
else
r = m;
}
printf("%d\n", l);
}
return 0;
}