Problem D. GoroSort

Last-modified: 2011-07-19 (火) 15:19:44
 

問題

五郎は4つの腕を持っている。
五郎はとても強い。
あなたは五郎に関わらない方がいいだろう。

五郎は N 個の異なった整数をソートしなければならない。
五郎はアルゴリズムが得意じゃない、五郎の強みは力だ。

五郎は、2つの手を使いいくつかの要素を押さえつけ、残り2つの手でテーブルを叩きつけることを計画している。
これを実行すると、押さえつけていない要素が空中へ飛び、ランダムにシャッフルされた後、要素が配列の空いている場所へ戻る。

五郎は可能な限り、すばやく配列をソートしたいと思っている。
五郎は賢いため、どれを押さえつければ早くソートされるかを知っている。
あなたには、五郎が何回テーブルを叩きつければいいかを求めて欲しい。

五郎は配列を保持するため、2つの手に無数の指を持っている。

五郎はテーブルを叩きつける前に、押さえつける要素を複数選ぶことができる。
五郎は、以前の結果に応じて、異なる選択をすることができる。
テーブルを叩きつけた際に、押さえつけていない要素がランダムに入れ替わる。

テーブルを叩きつけた際のシャッフルは、完全なランダムと考えてよい。

入力

T
N
X1 X2 ... XN
...

複数のデータセットが入力として与えられる。
入力の1行目はデータセットの個数 T である。
2行目から T 個のデータセットが続く。

一つのデータセットは2行からなる。
データセットの1行目は、ソートすべき整数の個数 N である。
2行目には、実際にソートすべき整数 X が N 個並んでいる。

出力

Case #x: y
...

データセットごとに1行出力せよ。
出力する値は、データセットの番号 y (1 から始まる) 及び、ソートされるまでに五郎が机を叩く回数 x の期待値である。
x は 10^(-6) 以下の誤差を含んでよい。

制限

1 ≦ T ≦ 100

データセット (小)

1 ≦ N ≦ 10

データセット (大)

1 ≦ N ≦ 1000;

サンプル入出力

入力

3
2
2 1
3
1 3 2
4
2 1 4 3

出力

Case #1: 2.000000
Case #2: 2.000000
Case #3: 4.000000

解説

サンプル入出力のデータセット #3 について解説する。
この場合は、左の二つの要素を固定し、右の二つの要素 4, 3 をシャッフルする。
順番が違う2つの要素が正しい順番になる期待値は 2 である。

その後、五郎は右の2つの要素を固定し、左の二つの要素 2, 1 をシャッフルする。
この期待値は 2 である。

よって、答えは 4 になる。

ヒント

重複していない N 個の要素を順番に並べる期待値は N です。

提出・原文

http://code.google.com/codejam/contest/dashboard?c=975485#s=p3

回答例

作成者ソースコード
pine[e]fileGCJ_2011QRD_GoroSort.cpp

[入力欄を追加]