Google Code Jam Japan 2011 に挑戦してみました


結果は以下のようになりました

34

1つ以上の問題について Small と Large を解いた参加者が決勝に進出できます。

とのことなので、問題CのSmallとLargeを解いているので決勝には進めるのかな?


実際に出題された問題は上のリンクの「問題を読む」から読めます

(予選終了後に、練習問題として開放された?現在はまた挑戦できるようになっています)

また、「スコアを見る」というリンクから、予選参加者の全スコアと正解した問題のソースコードをダウンロードして見ることができるようです



で、解いた順番に自分の回答のおさらい

(ソースはCode Jamのサイトからダウンロードできるので載せません)


・C問題(ビット数) Small

Small問題は総当たりで数えてもなんとかなりそうだったので、総当たりで

(とりあえず、1問解いてはずみをつけるという意味でも)

とはいえ、計算量を減らすために与えられた数の半分までの数の奇数のみ試行という条件入り


・A問題(カードシャッフル)Small

こいつは素直に問題文の内容をコードに落としこんでいっただけ

(基本的にSmallの問題は特に何も考えずに素直に組んでも解けるみたい)


・B問題(最高のコーヒー)Small

これが一番難しかった様子(TwitterのTLや#gcjjタグを見ても同じ意見が多数)

これも一応素直?に組んだつもり


指定された日数分の幸福度を保持する配列を用意し賞味期限の日から逆にたどって、それぞれの日の幸福度がMaxになるコーヒーを探っていくという戦法

一応、各コーヒーごとに上記のループを回しているので、幸福度を置き換える時に、別の種類のコーヒーがセットされていればそれをもっと前の日にもっていくという処理を再帰で組んでます


・A問題 Large

Smallのコードに解かせてみたらOOMだの時間がかかり過ぎだので諦めてタイムアップ


・C問題 Large

C問題はサンプルにLargeの問題が入っていて、Smallのコードだと答えが出るのに時間がかかっていたので確実に同じコードだと解けないことがわかっていたので書きなおした


与えられた数を2進文字で表現した時の、文字列長をMとして、M-1桁すべてを1埋めしたものを片方の値として解く戦法

M-1桁だけだと本当にあってるかどうか不安だったので、それをM-2、M-3....1桁までやって一番大きいものを返すようにした

(それでも400msかからずに解けたのでよしとする)


・B問題 Large

これも問題の制約を見て、日数がintで収まらないので「指定された日数分の幸福度を保持する配列」が作れないので書きなおした


コーヒーごとにクラス(フィールドのみ持ってる、Cでいうところの構造体みたいなやつだけど)を作り、それを幸福度の大きいものからソートする

で、また最終日から順番に、幸福度の大きいものから総幸福度に加算していく戦法


ただ、1問目は1瞬で解けたけど、2問目が一向に解けずにタイムアップ




やってみた感想

GDDのDevQuizの時も感じたけど、やっぱり面白かった

トップレベルの人たちは(良い意味で)頭おかしいんじゃねぇの?こっちが1問解いてる間に全問正解させるとか...


決勝進出の案内とか来てないけど、進めたら決勝もやってみたいなぁと(予選とどのくらい問題のレベルが違うのかわからないけど...



2011/10/03 追記

Code Jamの公式Twitterアカウントがありました(Code Jamのサイトからもリンクされてたのをすっかり見落としてました

「本日の予選に参加された皆様、お疲れ様でした!予選の結果については、来週頭に個別のメールにてお知らせいたします。」

とのことで、本日の15時くらいにメールが届きました


47


決勝進出できるみたいです!

決勝もがんばるぞい