けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 055 C - Scc Puzzle (ARC 069 C) (5Q, 茶色, 300 点)

この時代多く見られた「グルーピング」の問題!

問題概要

S 型ピース 1 個と c 型ピース 2 個を使って、下図のように Scc を 1 個作ることができる。

また、c 型ピース 2 個を使って S 型ピース 1 個を作ることもできる。

今、S 型ピースが  N 個、c 型ピースが  M 個ある。このとき、Scc を最大で何個作れるか?

制約

  •  1 \le N, M \le 10^{12}

考えたこと

Scc を作るためには、S と c の両方が必要となる。よって、S が多すぎるときと、S が小さすぎるときとで状況が異なる。具体的には

  • S が多すぎるとき: S \gt 2c のとき
  • c の方が供給が多いとき: S \le 2c のとき

というように区別できる。(が、最終的には閾値の考察は不要になる)

S が多すぎるとき

S を解体して c にすることはできない。よって、c の個数がネックとなる。c を限界まで使うと、Scc を

M / 2

作ることができる。

c の方が供給が多いとき

この場合は、c を組み合わせて S にすることができるので、c を目一杯使い切ることができる。よって、S や Scc も、c の個数に換算して考えればよい。次のように考えよう。

  • S:c が 2 個分である
  • c:c が 1 個分である
  • Scc:c が 4 個分である

つまり、c が合計で  2N + M 個あると考えて良い。4 個の c で Scc を作れることから、求める Scc の個数は

(N * 2 + M) / 4

となる。

まとめ

上記の 2 つの場合のうち、小さい方が答えだと考えられる。つまり、答えは

min(M / 2, (N * 2 + M) / 4)

である。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long N, M;
    cin >> N >> M;
    cout << min(M/2, (N*2+M)/4) << endl;
}