首先考虑二分答案。接下来考虑问题:在已知情况下,能不能使用给出的巧克力拼接出 sschild

下面分别将四个巧克力定义为 I, L, C, T 型。

对于 il,显然只能用 I 型巧克力拼接,所以直接减去 3s3s

接下来考虑 chd 三个字符。有一个一眼看上去很显然的事实:贪心选取 C 或者 T 型一定会更优,因为这样可以节省对 IL 的占用。然而,在实际情况下会有这样的例外:

  • 在拼接某个形状的时候,本来可以用两个 L 和一个 I 搞定,但是用了一个 T 后就只能用两个 I 拼接。在这个情况下,引入 C 或者 T 型会增加对 I 的负担。

但是在这一题中,出于特殊性质,这个情况是不会发生的。也就是说,C 型和 T 型的使用必然会减少负担。这一点不妨自行手操一下。

然后就是决策了。首先,C 型和 T 型中,只有 C 型可以放在 c 上,而二者都可以放在 hd 两个字母上。所以考虑先将 C 型安排到 c 上,然后两者看成一类,共同放进 hd 两个字母中。

剩下的就是对 IL 的处理了。此时还剩下被填充了一部分或者没有被填充的 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;
}