当サイトの記事にはプロモーションが含まれています。
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の方をチェックする方がシンプルに書けると思います。詳細はコードを参照してください。