A 問題としては、少し難しめな感じ。
問題概要
1, 2, 3, 4, 5 を並び替えて得られる数列 が与えられる。この数列に対して
「隣接する様子を swap する」
という操作をちょうど 1 回だけ行って、単調増加にできるかどうかを判定せよ。
考えたこと
この問題に似ている。
この問題「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; }