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;
}
投稿日時:
最終更新: