AtCoder NoviStepsを埋めてみる(4) bit全探索の続きです。今回は順列全探索です。

C++ であれば標準ライブラリである next_permutation 関数を用いて順列全探索を行うことができます。ただ C# にはこのようなものがないそうです。しかし ac-library-csharp というライブラリには同じようなメソッドがあります。今回はこれを使い倒すことにします。

参考: ac-library-csharpを使ってみる

StlFunction.NextPermutationメソッドの使い方は C++ の next_permutation 関数 とほぼ同じです。

C – Count Order

C – Count Order

問題の概要

(1, 2, …, N) を並び替えてできる数列 P, Q がある。
N の順列は N! 通り考えられるが、このうち P が辞書順で a 番目に小さく、Q が辞書順で b 番目に小さいとして |a – b| の値は?

StlFunction.NextPermutationメソッドで順列を求め、数列 P, Q が何番目の順列かを調べればよいです。

C – Average Length

C – Average Length

問題の概要

座標平面上に N 個の町(座標は (x[i] , y[i]))がある。
これらの町をすべて 1 回ずつ訪れるとき、その移動距離の総和の平均値を計算せよ。

N 個の町を並べ替えた順列を生成して出発点から終着点までの移動距離の総和を計算してその平均値を求めればよいです。

C – One More aab aba baa

C – One More aab aba baa

与えられた文字を配列に格納して StlFunction.NextPermutation メソッドを使えばよいです。文字も整数の配列と同じように使えます。先頭の順列から何番目かを求めなければならないので入力された文字列をソートしておく必要があります。

C – Select Mul

C – Select Mul

問題の概要

整数 N が与えられる。
N の各桁の数字を取り出して並べ(並べる順序は好きに変えてよい)、2 つの正整数に分離する。
ただし、分離されたあとの 2 整数に leading zero が含まれていてはならない。
分離後の 2 数の積の最大値は?

整数 N を文字列とみなしてその順列を考えます。2 数にわけるときはわけることがすべての部分を考えます。2 数にわけたらその積を計算して最大値を求めます。