Google code jam 2010 Round 1A

参加したよ。

Result

409位 59点 2:38:29
32:38 33:16 / 2:17:41(4 WA) 2:22:29 / - -


またDPで時間取られたよ!!ほんと早くまともにかけるようになれよ!!
とりあえずRound1は通過。

A. Rotate

問題

赤と青のブロックを積み上げ(空中にブロックを置くことはできない)、縦または横または斜めのいずれかにk個同じ色が揃ったらその色のプレイヤーが勝ちというゲームがある。


今ある盤面が与えられるが、それを90度時計回りに回転させる。
回転させた後で、ブロックは重力を受けてまっすぐ下に落ち、地面に積みあがった状態になる。
この状態で赤、青のプレイヤーが勝っているかどうか判定せよ。

試行錯誤

問題文を読む。うげ、またゲームっぽい問題だ……
と思ったら盤面の状態を判定するだけでよいらしい。助かった……


回転させて重力……とりあえず回転を書く。
重力は最初に隙間を全て右につめておけばいいか。書く。


あとは判定。
うーめちゃくちゃ長くなった。書いた。


あれ?全部勝者なしになっとるw
数字読み込んでなかったwww


修正。サンプル通った。
small通った。largeも送信。

B. Make it Smooth

問題

数列の隣り合う項の差が全てM以下であるときその数列はSmoothであるという。
数列に対し、以下の操作が任意の回数できる

  • コストDで項を一つ消去
  • コストIで好きな数の項一つを好きな場所(両端含む)に挿入
  • ある項の数を変更(コストは変化前後の数の差の絶対値)

D,I,Mと数列が与えられたとき、この数列をSmoothにするための最小コストを求めよ。

試行錯誤

えー……とあからさまにDPぽい。数列の各項が0≦ai≦255とかあからさますぎる。


なんかよくわからんが書いてみよう。
手が止まる。どうしたらいいんだ?


i個目まで使って一番右の数がjのときの最小コストをdp[i][j]としてもてばいいのかな?
しかし漸化式がよくわからない。あたまわるくてしんじゃう!!!


あれトップの人もう全部解きおわってんじゃんw


漸化式を冷静に考えよう。
元々aiとmの差がj以下の場合があって?前までとaiを使って最後をjにするには?
前の値kからaiを並べてjをつなぐか、aiを並べてjに変更する???


そもそもaiを並べるやりかたはどうなんだ??
前の値kとaiの差がm以下だったら単にaiを置けばよくて……
差がmより大きかったら?いや、dp配列は最後の値を0-255のパターン全部持ってるんで
それは考える必要ない!!


じゃあj→ai(変更?)→(適当に挿入)→kという作り方があって
これループにすればいいか!
あとaiをデリートするパターン!


実行。サンプル全然あわない。
何がおかしいんだ?もう時間ないしsmallだけで通すかなあ。。。


残り15分くらいまではプリントデバッグしよう。
dpを出力してみる。なんだこれ値がデタラメだ。
あれ?切り上げして1引かないのか?引いちゃだめだな。修正。
添え字も間違ってる。終わってるほどに頭わりーwww


直す。サンプルとおった!!!
small実行。


おちたwwwwなんでだよwwww


あーmって0の場合もあるのか!!
m=0だったら一つ除いて削除すりゃいいんか?急いで修正。


時間切れ。くそが!!!
次のファイルダウンロード。


WA.しかも結構時間かかる。最適化オプションつけよう。


おいd*(n-1)がd*n-1になってるよ!括弧ついてねーよ!


WA.


あ、ちがうだろ!同じ値が何個かあるかもしれないから最大個数のやつ除いて削除。


WA.


そもそもちがう!!
値の変更できんだろクズが!!!!


dpに組み込まないとダメだ。
組み込んだ。okサンプルも正しい。


5度目の正直でsmall通った!!!
largeも実行。やたら時間かかる。これ最適化オプションつけてなかったら絶対に8分かかってるw
最大でも256^3*100なんだけどなー。3分くらいで実行終了。submit.


残り12分。Csmallだけできないかな。
読み終わった時点で残り3分。できなさそう。終了。