2014年8月6日水曜日

AOJ Sort II - Minimum Cost Sort

会津大学オンラインジャッジ。
問 ALDS1_6_D

Sort II - Minimum Cost Sort


の解法。
問題原文はこちら。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_6_D


独自解法。

配列の要素をマスとし、ソート後にあるマスに入る数字をそのマスの正しい数字と定義します。

問題の着目点。
要求されるタスクは、4,1,3,5
とあったとき
1を正しいマスに確定する。
3を正しいマスに確定する
4を正しいマスに確定する
5を正しいマスに確定する
ということです。

これを踏まえて解法を考えます。

解法は以下の通り。

処理A
数字列が与えられたとき、一番小さな数字に注目します。
一番小さな数字の入ってるマスに入る正しい数字。
これと一番小さな数を交換します。
一番小さな数が自分の正しいマスに入るまでこの作業を繰り返します。
正しいマスに入れば処理は終了です。

次は2番目に小さな数3番目に小さな数、、、も同様に処理Aを繰り返します。


これは、一番小さな数と、その小さな数のあるマスを正しい数で交換すれば、正しい数は最も低いコストでマスを確定できるのでこの処理は妥当です。



しかしこれだけでは処理はうまくいきません。
2番目に小さな数以降を処理する場合。
その数をm番目に小さな数だとします。

処理B
まず処理Aをした場合を考え、この時の交換手順をRとして記録します。

処理C
次にm番目に小さな数と一番小さな数を入れ替えてその後はRの交換手順通りに交換し、入れ替え終了後m番目に小さな数と一番小さな数を交換した場合。

Cのほうがコストが小さくなる場合があります。
B,Cを検討し、小さいほうを処理Aのコストとして確定します。


しかしRという点ではBもCも同じ処理ですから、処理Bの副産物として簡単に処理Cの場合のコストが出ます。

後は上記処理を効率的に実装した結果。
私の場合この問題の最悪の計算量はBigO 1000*log(1000)という結果となりました。





AOJを知っている方ならコードが合格したらまず解法に間違いがないとご理解いただけると思います。
私は6時間ほどコードをいじくりながらああでもないこうでもないと一人考えました。
その結果上記解法を思いつきこれに従いコードを実装したところ合格したので。
まず解法に間違いはないと思います。



解法者
兵庫県加古川市加古川町南備後79-16
堀江伸一

0 件のコメント:

コメントを投稿