本日は、Practive I の一番難しい 1000 点問題です。タイトルは、DiskDefrag です。この問題ですが、すこし格闘してみましたが問題の意味がちゃんと理解できていませんので回答することができませんでした。
例題では、引数 disk に、{“3 4 5 6 8 9 10″,”17 16 15″} というようなあるファイルが存在しているセクタ番号が順番に指定されていて、引数 size に 20 と指定されていてこれはディスク上の存在している合計のセクタ番号です。
それで、引数 disk をデフラグしてセクタ番号を順番に並べて一番セクタを移動させて少ない回数の戻り値を返しなさいという問題だと思います。
この問題の解説は、[Google Code Jam 2004](http://www.icefree.org/~vvp/26.html) にのっているとおり、過去問です。
とりあえず、人のコードを参考にして自分なりに動かしつつ理解しようと試みましたが、完璧には理解できていません。







移動させなくてもよいセクタの組み合わせを求め(=移動回数が少ない)、その移動しないセクタの数が多くなる方から総当りで探索させてみましたけど、当然のごとく計算時間超過。上手い枝狩り方法があるのか、基本的にアルゴリズムの選択が間違っているのか・・・。
>nivashさん
コメント、ありがとうございます。
高いレベルの問題になってくるとアルゴリズムがますます重要になってきますよね。
現在、topcoder.comでは計算時間は2秒以内に終わらないといけないらしいですからつらいところです。