読者です 読者をやめる 読者になる 読者になる

C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

No.24 数当てゲーム|yukicoder

No.24 数当てゲーム - yukicoder を解きました。

#include <bits/stdc++.h>
#define REP(i,n) for(int i=0; i<(n); i++)
using namespace std;
struct cww{cww(){ios::sync_with_stdio(false);cin.tie(0);}}star;
int main()
{
    int N;
    cin >> N;
    
    vector<int> res( 10, 1 );
    REP( i, N )
    {
        vector<int> vc(N);
        REP( j, 4 )
        {
            cin >> vc[j];
        }
        
        string R;
        cin >> R;
        
        REP( j, 4 )
        {
            if( R == "YES" )
            {
                res[vc[j]] += 1;
            }
            if( R == "NO" )
            {
                res[vc[j]] = 0;
            }
        }
    }
    cout << distance( res.begin(), max_element( res.begin(), res.end() ) ) << endl;
    return 0;
}

・YESの中には必ず解となる数字が含まれている
・NOの中の数字が解になる事はあり得ない

まとめると、全てのYESの中に出現し、NOに一度も出現しない数字が解となる

実装はかなり迷走して、最終的に↑上記コードに落ち着きました(4回くらい書き直した(5提出))

最後のOUTPUTにカウント数が一番多いvectorのindex数を取得したい訳なんですが、
max_elementdistance の合わせ技で求まりました(便利!)

//MAX値を取得
auto MAX = max_element( res.begin(), res.end() );
//MAX値が先頭から何番目か取得
auto index = distance( res.begin(), MAX );
//index番号OUTPUT
cout << index << endl;
//1行で
cout << distance( res.begin(), max_element( res.begin(), res.end() ) ) << endl;

他にも find で見つけた値に対して distance してindexを取得したり、と大変便利。
STLって楽しい!