AtCoder Regular Contest 147 B問題 Swap to Sort
問題
提出解答
問題の概要
の順列 がある. 以下の操作を繰り返し行い, を昇順に並び替えたい.
- 操作 (A): を選び, を入れ替える.
- 操作 (B): を選び, を入れ替える.
このとき, 操作 (A) の回数が最小であり, 合計操作回数が 以下である操作の手順を1つ挙げよ.
制約
- は の順列
解法
が順列であることから, 以下の2つの値は一致する. その値を とする.
- の第奇数項目にある偶数の数
- の第偶数項目にある奇数の数
このとき, 操作 (A) の最小回数は である.
- 以上であること: 操作 (A) を1回行うと, 第奇数項目にある偶数の数は 減るか, そのままか, 増えるかのどれかである. よって, の状態から の状態にするためには最低でも 回必要なことがわかる.
- 以下であること: 次のようにして 回で第奇数項目にある偶数の数を にすることができる.
- 奇数項目にある偶数を全て左 (項番号が小さい方) に移動させる (第 項目が偶数になる).
- 偶数項目にある奇数を全て左 (項番号が小さい方) に移動させる (第 項目が奇数になる).
- に対して, 操作 (A) によって, を入れ替える.
これによって, 奇数項目には奇数が, 偶数項目が偶数が並んでいる状態になる. これにより, 奇数項目, 偶数項目それぞれに関してバブルソートを施すと, 全体としても昇順に並ぶ.
操作回数について考える. 長さが の順列について, 隣接項同士の入れ替えにおいては高々 回で任意の順列にすることができる. また, であるから, 操作回数は多く見積もっても,
であるから 回以下に操作回数を収めることができた.