TopCoder SRM 493 (Div 1) 参加記録
Result
Challenge Succeeded / System Test Failed / Unopened
220位
1789 -> 1710
skyさんeomoleさんと一緒の部屋。
Easy StonesGame
問題
N個の石が一列に並んでいて、M個目だけが白で他は黒。
二人のプレイヤーが、手番に白石が入っている連続するK個の石を逆順にするゲームをする。
最初にL番目に白石を置いたプレイヤーが勝ちである。
お互いが最善の戦略を取ったときどちらが勝つか求めよ。
石の数は100万以下。
試行錯誤
石の白黒をひっくりかえすという致命的な誤読をする。
ゲームが3手以上続いて、どっちかのプレイヤーが必勝になるなら、最初の1手か2手で相手と同じ選び方をして、状態を無限ループさせることができるので引き分け。
ゲームが最初の1手で終わるなら先手勝ち。
これはM個目とL個目が同時にK個の選ぶ範囲に入ればおk.
そうでないなら先手はなるべく石をMから遠ざける。
で、そっから同じように後手が勝てるなら後手勝ち。さもなければ引き分け。
お、簡単!?書いた。サンプル合った。
間違ってないか慎重に確認してサブミット。
Medium AmoebaCode
問題
0〜Kの数字からなる文字列が与えられる。
文字列のそれぞれの0を、好きな1〜Kの数字に置き換えて、
「任意の同じ数字のペア間の距離の最小値」を最大にしたい。
そのような最大値を求めよ。文字列の文字数は50以下、Kは7以下。
試行錯誤
Easyを見直して、論理におかしいところはないし、もしかしたら久々にレート下落に歯止めがかけられるかな、とか思う。
まず、答えの上限はK.なぜなら数字はK種類しかないので、K回以内に必ず同じ文字が出現するから。
よって答えに影響を与える数字は、最高でも過去6文字分。
てことはdp[i][j]で、i文字分、過去のK個の情報jでDPすればいい。
jは2^7通り?
違う、位置も覚えなければならないから7^6通り。
50*7^6*7=4000万 で余裕で間に合いそう。
じゃあjを8^6にすればビット演算使えてちょっと書きやすい。
コーディング。
ビット演算逆向きにしてたりで少しハマる。
落ち着いてよく考えろ自分。
合った。ミスしてないよね?時間大丈夫だよね?大丈夫。
送信。
Hard
開いてない。
Challenge
皆の300の解法が全然ちがう!速攻で自分の300が落とされた。
えー解法おかしいとこないと思うんだけどなあ。
450、skyさんのこんなにvectorとかmapとか使っても間に合うんだろうか。
まあよくテストしてたし間に合うんだろうなー。
落とせるものがないので終了。
System Test
450まで落ちた。しょっく。。。
計算量に、数字をK-1個見るコストを考えてなかった。
自分のコードだと計算量50*8^6*7*6になってるよ。これじゃあ間に合わない。