公式

C - AtCoder AAC Contest 解説 by MMNMM


コンテストを一つ開催するために A が \(1\) つ必要なので、答えは \(n _ A\) 以下です。 同様に、コンテストを一つ開催するために C が \(1\) つ必要なので、答えは \(n _ C\) 以下です。 また、コンテストを一つ開催するために文字が \(3\) つ必要なので、答えは \(\left\lfloor\dfrac{n _ A+n _ B+n _ C}3\right\rfloor\) 以下です。

以上をあわせて、答えは \(X=\min\!\left\lbrace n _ A,n _ C,\left\lfloor\dfrac{n _ A+n _ B+n _ C}3\right\rfloor\right\rbrace\) 以下です。

答えが \(X\) になることを示します。 実際に \(X\) 回のコンテストを開催できることを示せばよいです。

\(X\le n _ A\) より、A は \(X\) 個以上あります。同様に C も \(X\) 個以上あります。 高橋くんが持っている文字から A を \(X\) 個、C を \(X\) 個取り除いたあと、残った文字が \(X\) 個以上あればそれらを使って \(X\) 回のコンテストを開催できます。 \(X\le\left\lfloor\dfrac{n _ A+n _ B+n _ C}3\right\rfloor\) から \(3X\le n _ A+n _ B+n _ C\) がいえるので、\(n _ A+n _ B+n _ C-2X\ge X\) となり、示されました。

以上より、\(X=\min\!\left\lbrace n _ A,n _ C,\left\lfloor\dfrac{n _ A+n _ B+n _ C}3\right\rfloor\right\rbrace\) を出力することでこの問題を解くことができます。

実装例は以下のようになります。 \(n _ A+n _ B+n _ C\) の値が \(2 ^ {31}\) 以上になる場合があることに注意してください。

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int T;
    cin >> T;

    for (int t = 0; t < T; ++t) {
        unsigned n_A, n_B, n_C;
        cin >> n_A >> n_B >> n_C;
        cout << min({n_A, n_C, (n_A + n_B + n_C) / 3}) << endl;
    }
    return 0;
}

投稿日時:
最終更新: