問題
問題文
AtCoder では現在、 ABC , ARC , AGC , AHC の 4 つのコンテストが定期的に開催されています。
AtCoder で現在定期的に開催されているコンテストは $S_1, S_2, S_3$ とあと 1 つは何ですか?
制約
・$S_1, S_2, S_3$ はそれぞれ、ABC, ARC, AGC, AHC のいずれかである。
・$S_1, S_2, S_3$ は相異なる。
回答
回答1 (AC)
4 つのコンテストの名称をリストに記憶し、コンテスト名を読み込むごとに何番目の要素と等しいかをチェック、別の配列にその情報を保存していけば良いでしょう。4x4=16回の繰り返しが必要ですが、全く問題のない回数です。コードは以下のようになりました。
abc217b-1.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<string> contest = { "ABC", "ARC", "AGC", "AHC" };
vector<int> found(4,0);
string s;
for ( int i=0; i<3; i++ ) {
cin >> s;
for ( int j=0; j<4; j++ ) {
if ( s==contest.at(j) ) {
found.at(j) = 1;
}
}
}
for ( int j=0; j<4; j++ ) {
if ( found.at(j)==0 ) {
cout << contest.at(j) << endl;
}
}
}
回答2 (AC)
回答1の場合、コンテストの個数が増えると繰返し回数が膨大になってしまいます。そこで考え方を逆転し、コンテスト名を読み込むごとに最初のリストから削除していくことにします。こうすることで、最後に残ったコンテスト名が答えとなります。コードは以下のようになりました。
abc217b-2.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
set<string> contest = { "ABC", "ARC", "AGC", "AHC" };
string s;
for ( int i=0; i<3; i++ ) {
cin >> s;
contest.erase(s);
}
for ( auto itr = contest.begin(); itr != contest.end(); ++itr ) {
cout << *itr;
}
}
調べたこと
AtCoder の解説 → 公式解説
回答1と同じ方針でした。
リンク
前後の記事
- 前の記事 → AtCoderログ:0103 - ABC 217 A
- 次の記事 → AtCoderログ:0105 - ABC 217 C