C++の練習を兼ねて, AtCoder Beginner Contest 072 の 問題D(Derangement)を解いてみた.
■感想.
1. 解説の方針と, 多分おおよそ一致していると思うので, 良かったと思われる.
2. 隣り合う二つの数を選んでスワップするというシンプルな操作であるが, 個人的には, 面白い問題だったと思う.
本家のサイトABC072 / ARC082 解説をご覧下さい.
■C++版プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <iostream> using namespace std; #define FOR(i, a, b) for(int i=(a); i<(b); ++i) int main() { // 1. 入力情報取得. int N; cin >> N; // 2. swap回数をカウントアップ. int bp = -99999; // 前回出現した p の値. int swap = 0; // swap回数を保存. FOR(i, 1, N + 1) { int p; cin >> p; // p = i なら, increment. // cout << "swap=" << swap << " p=" << p << " bp=" << bp << endl; if(p == i) swap++; // p = i かつ, 前回の p が, i - 1 だったら, decrement. if(p == i && bp == i - 1) { swap--; continue; // 前回出現した p の値 は, 更新しない. } bp = p; } // 3. 出力 ~ 後処理. cout << swap << endl; return 0; } |
■参照サイト
AtCoder Beginner Contest 072