はまやんはまやんはまやん

hamayanhamayan's blog

調の判定 [yukicoder 1109]

https://yukicoder.me/problems/no/1109

解説

https://yukicoder.me/submissions/510555

全てのDについて全探索しよう。
あるDの音階が含まれるかどうかを判定する。

setを使うのがオススメ。
setに配列Tを全部入れて、
Dの音階に含まれる音を消せるだけ消したときに、
setが空になれば、その音階だけで構成されてるので、答えとしてカウントする。

答えがただ1つならそれを答えて、そうでないなら-1を答える。

int N, T[12];
vector<int> ds = { 0, 2, 4, 5, 7, 9, 11 };
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    rep(i, 0, N) cin >> T[i];

    vector<int> ans;
    rep(D, 0, 12) {
        set<int> rest;
        rep(i, 0, N) rest.insert(T[i]);
        fore(d, ds) rest.erase((D + d) % 12);

        if (rest.empty()) ans.push_back(D);
    }

    if (ans.size() == 1) cout << ans[0] << endl;
    else cout << -1 << endl;
}