OilDrum's PLAYGROUND

どらむかんのゲーム日記サイト

当サイトの記事にはプロモーションが含まれています。

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枚以上のカードがそれぞれ存在する必要があるので、flag3flag2でそれぞれをチェックします。if文の条件分岐では先にflag3の方をチェックする方がシンプルに書けると思います。詳細はコードを参照してください。