Google Code Jam Japan 2011 - Final Round

GCJの日本大会でごわす。200位以上でGoogleTシャツがもらえるとかでマジ狙いしてたのですが、残念ながら211位で無理でした。終盤、Small一つを狙う作戦に切り替えたのですが、切り替えが遅すぎてデバッグが間に合わず(笑)。最近の若い子たちのスピードに、おっちゃんついていけてません。

以下各問題について感じたことなど。

A. アンテナ修復

棒の並べ方は全部でK!パターン。Largeで最大K=1000。よって全探索は×。とりあえず安全にSmallを next_permutation() で片付けて、その後じっくりと貪欲なアプローチを吟味。少し考えれば簡単で、三角形の面積は二次だから面積最大化のためには大きい物同士を優先的に掛ければ良さげ。ただ環状になるから着目棒の左右両方についてそれを考える必要がある。というわけで、最長の棒を真ん中として、そこから長さ順に右左右左・・・と置いた。CorrectしたSmallで出力を検算してから送信。・・・最初、幾何問題かと勘違いして解くのを後回しにしたのがもったいなかったなぁ。

B. バクテリアの増殖

最初に手がけた問題。俺の苦手な多倍長演算。x^xをB回計算する問題。ただし出力は mod C する。愚直にやるとint範囲をオーバーするのは明らかなので上手な方法を考える必要がある。とりあえずSmall向けにバイナリ法 with mod によるコードを書くもサンプルすら一致せず(コンテスト後の質問にあったように469が出てきた)。結局これが解決できずコンテスト終了。・・・なんかPythonで普通に書いたら問題なく通るらしい。なんじゃそりゃ。
Largeのほうは全く分からず。トップの方のコードはオイラーのφ関数とDPみたいな感じだった(たぶん)。これは俺には書けないな。また解説によると巡回を見つける感じらしい。でも解説動画が肝心な所で止まるのでそれ以上は分からず。実は巡回はいろいろ出力して試してたんだけどね。むしろそこから先がわかりませんでした。

C. ワイルドカード

なんか2つの文字列の文字対応表みたいなのを作ってうんうん考えたけど、パッと思いつかなかったので非トライ。

D. クローゼットルーム

終盤、頑張って全探索を実装するもデバッグが間に合わず。てか何かを勘違いして「このサンプル間違ってね?」とか思い込むという痛い感じに(笑)。

E. 無限庭園

複雑な幾何問題臭かったので非トライ。実際は思ったよりも簡単な問題だったみたい。解説でヒルベルト曲線出てきた(笑)。