Google Code Jam 2011 Round1A
この週末は地味に予定が入っていたので、
1Aで通過しておきたいなーという感じでやってみました。
問題概要がだいぶ適当なのは仕様です。
- -
A : FreeCell Statistics
問題:今日はNゲーム以下を遊んで勝率がちょうどPD%,過去の戦績と合わせて勝率がちょうどPG%になった。こんな事はありえるのか判定する問題。
- まず0%と100%は適当に例外処理しちゃう。
- そして、ちょうど1〜99%になるゲーム数Dについて考えてみる。
- まぁ,Dが 100/gcd(100, PD) の倍数なら丁度PD%にできるよね…。
- なのでNが 100/(gcd(100, PD)) 以上ならちょうどPD%が実現できる。
- あとは、G>Pだし、PG%は適当な感じで実現できる。
- N≦10^15なのに、なぜかNをintで読んでてlargeを落としました。
B : The Killer Word
問題:Seanを文字列ゲーでフルボッコにしてキャンディーの恨みを晴らす問題。
- ぼくのトラウマTwenty Questionsを彷彿とさせる。
- というか同じ感じで解けるんじゃね。
- ちなみに、当時は問題文を盛大に読み間違ってて鬱展開になった。
- 適当にDFSでシミュレーションする。
- 文字を指定したときにどこがオープンするかを文字列ごとにビットで持っておく。
- と、各深さでの分類作業がO(n log n)くらいでできそう。
- 残ってる文字列リストをオープンビットをキーにしてソートする感じ。
- 深さも最大26なので、いけそうな気がした。
- 書いてみたら普通にsmallが解けた。
- 覚悟を決めてlargeもやってみたら実行に1分半かかってちょっぴりドキドキした。
C : Pseudominion
問題:山札からカードを引いたり、点数を増やしたり、ターン数を増やしたりできるカードを順番に使って得点を最大化する問題。
- 上手いこと考えれば先頭から処理できるに違いない…とかしばらく考えてた。
- そして、俺の苦手な超絶DPだと思い始めて苦悶し始めた。
- 時間がなくなってきたので、とりあえずsmallだけ考えてみることに。
- カードを引く枚数cが、0か1の2通りだけ。
- まぁ、ターン数が増えるカードはとりあえず使っておいて良い感じ。
- ターン数が増えるカードを使い切ったあとは…
- ターン数分、点数が高いカードを貪欲に使う
- c=1のカードを1個使って様子を見る
- これ、それぞれの場合をシミュレートするだけじゃね…。
- 使用済みフラグの更新を忘れたり、+と-を間違えたりしてだいぶハマった。
- 最終的にはsmallだけではあるけど通せたので良かった。
- -
結果:Rank 36 : /ox/oo/o-/ Score 51, Penalty 2:18:12
だいぶ凡ミスをやらかしてしまって残念な感じではありましたが、
問題が難しかった影響か、順位はだいぶ高めでした。
次あたりはこういうミスが命取りになりそうなので、なくしたいところですが…。