srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

yukicoder No.360 増加門松列

問題

問題概要

門松行列の判定を複数回行う問題。

解法

7つの数字が与えられる。それを並び替えることによって、左から順に3つずつの数字を見て、それが門松列になっているかを調べる。それを左から右へ一つずつずらして、すべて調べ、すべての場合において門松行列となるものがあるかどうか調べればいい。数字は7個しかないので、next_permutationを利用して、すべての順列を調べればいい。

ミス

門松行列の定義が難しい。(毎回忘れる)

コード

#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)

int main(void){
    vector<int> v(7);
    rep(i, 7) cin >> v[i];
    sort(v.begin(), v.end());
    do{
        for (int i = 0; i < 5; ++i){
            if(v[i] < v[i + 2] && v[i] != v[i + 1] && v[i + 1] != v[i + 2]){
                if(v[i] > v[i + 1] || v[i + 1] > v[i + 2]){
                    if(i == 4){
                        printf("YES\n"); return 0;
                    }
                }
            }else{
                break;
            }
        }
    }while(next_permutation(v.begin(), v.end()));
    printf("NO\n");
    return 0;
}