当サイトの記事にはプロモーションが含まれています。
ABC398 - B - Full House 3
最終更新:2025-04-04 投稿日:2025-04-04
2025/03/22に行われたユニークビジョンプログラミングコンテスト2025 春(AtCoder Beginner Contest 398)のB問題の解法についての記事です。
考えたこと
カードの種類と枚数を関連付けた連想配列と、全てのカードの種類を管理するものがあれば、あとはフラグをきちんと処理しさえすればよそうです。
コードの例
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> m;
set<int> s;
int tmp;
for (int i = 0; i < 7; i++) {
cin >> tmp;
if (m.count(tmp)) {
m.at(tmp)++;
} else {
m[tmp] = 1;
}
s.insert(tmp);
}
bool flag3 = false;
bool flag2 = false;
for (int n : s) {
if (m.at(n) >= 3 && flag3 == false) {
flag3 = true;
} else if (m.at(n) >= 3 && flag3 == true) {
flag2 = true;
} else if (m.at(n) >= 2 && flag2 == false) {
flag2 = true;
}
}
if (flag3 && flag2) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
解法
std::map
を利用して各カードの枚数をカウントします。
ここではstd::set
でカードの種類をチェックすることにしました。
フルハウスの条件を満たすためには、3枚以上のカードと2枚以上のカードがそれぞれ存在する必要があるので、flag3
とflag2
でそれぞれをチェックします。if
文の条件分岐では先にflag3
の方をチェックする方がシンプルに書けると思います。詳細はコードを参照してください。