けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 390 A - 12435 (6Q, 灰色, 150 点)

A 問題としては、少し難しめな感じ。

問題概要

1, 2, 3, 4, 5 を並び替えて得られる数列  A_{1}, A_{2}, A_{3}, A_{4}, A_{5} が与えられる。この数列に対して

「隣接する様子を swap する」

という操作をちょうど 1 回だけ行って、単調増加にできるかどうかを判定せよ。

考えたこと

この問題に似ている。

atcoder.jp

この問題「typo」とやることは一緒で、

  • 隣接 swap 操作を全通り試して
  • 条件に合うものがあるかどうかを調べる

というようにやればよい。

条件に合うかどうかを調べる部分では、「操作後の数列が {1, 2, 3, 4, 5} に一致するかどうかを判定する」のが簡単だと思われる。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> A(5);
    for (int i = 0; i < 5; i++) cin >> A[i];

    bool res = false;
    vector<int> correct = {1, 2, 3, 4, 5};  // 正誤判定用

    for (int i = 0; i+1 < 5; i++) {
        // 隣接 swap を試す
        vector<int> B = A;
        swap(B[i], B[i+1]);

        // {1, 2, 3, 4, 5} に一致するかどうか
        if (B == correct) res = true;
    }
    if (res) cout << "Yes" << endl;
    else cout << "No" << endl;
}