TopCoder Open 2010 Qualification Round 2
QR3は授業と重なってるので、ここで通らなかったら大変残念なことになるのだけど...!
- QR1で勝ち抜けて参加しない人も多いので、今日は問題の説明も入れてみます。
250: JingleRingle
- 1 jingle を buyOffers[i] ringle で買いたい人たちがいます
- 1 jingle を sellOffers[i] ringle で売りたい人たちがいます
- 1 jingle を X ringle で売ると、売った人は floor(X * tax / 100.0) ringle の税を支払います
- 0 jingle と ∞ ringle を持っています。売り買いして利益を最大にしなさい
- 5分ほど遅れて参戦。
- 安く買って、高く売ればいいのでは。
- 簡単だ。の割にみんな解くのがちょっと遅い気がする。読み間違えてるのかな?まぁいいか。
- カタカタカタカタ。
- buyOffers ってなんだか妙に打ちづらい...
- 実行。合わない...
- ...
- ...ほんとに greedy でいいの?
- でもビットDPできるサイズでもないな。
- あ、税は利益にではなく売却額に大してかかるのね。修正。
- 最後のケース以外直った。
- よく見たら buyOffers と sellOffers の要素数は等しいとかどこにも書いてない!
- 冷静にシチュエーションを考えると当たり前ですね。
- 出てきた。submit.
- ギリギリ200点代はキープしたけど、焦りすぎだなぁ。
- 取り合えず晩御飯食べて落ち着こう。
- ...
- ...で、ほんとに greedy でいいの?
- いいよね。きっと。
500: FuzzyLife
- ライフゲームの盤面が与えられます
- ルールはよく知られたものと同じです
- 盤面には 0 (生存) 1 (死亡) の他に、? も混じっています
- どのマスの8近傍にも、? はたかだか1個しかありません
- ? を 0 か 1 に書き換えた後で、次のステップを求めます
- 書き換えた後のステップの 1 の数が最も多くなるように書き換えてください
- 次のステップでの最大の 1 の数を返しなさい
- 濃厚に匂い立つある最大流...!
- ...
- ...最大流?
- そもそも「どのマスの8近傍にも、? はたかだか1個しかありません」って?
- ...
- あー。
- 2つ以上の ? と接していないってことは、各 ? はそれぞれ独立に決めていいってことだよね。
- 500なのにこんな簡単でいいのか?
- いいよね。きっと。
- 500なのにこんな簡単でいいのか?
- ? の周り 3x3 は両方試して大きな方をとる。それ以外はそのまま。さぁ実装だ。
- ...
- ...
- できた。やっぱり合わない。
- 3x3を切り出して?を書き換えて関数に放り込んでたけど、5x5を切り出さないと端のセルの生存判定できないよね。修正。
- まだまだ合わない。
- ? から遠いセルの次の状態求めてない!アホだ!
- sample 3 以外出てきた。それってどんなケースだ?
- 「外側のマスも1になるかもよ」ってご丁寧にも問題文に書いてある!
- 出てきた。
- sample親切だし、後はsubmitしてからデバッグしよう。ポチっとな。
- 小さいケース -> 出てる
- 大きいケース -> よくわからないけどとりあえず落ちない
- 端に ? があるケース -> 出てる
- 次行こう。
1000: HandlesSpelling
- 文字列 text と、文字列集合 words が与えられます
- textの部分列が words[i] になるような場所に、words[i] を重ねられます
- textの同じ文字の上に複数の words を重ねてはいけません
- 同じ words[i] を何度も使ってもOK
- (連続して重なっている text のもっとも長い部分の長さ)2 - (全く重なっていない部分の文字数) が得点です
- 最大の得点は?
- どうせ15分じゃ解けないだろうし、撃墜ケースでも作るかと思って開いてみる。
- 1000が自分に解けるほど簡単なはずがないだろうし、これもどうせ重み付き最大マッチングとかだったりするんじゃね?
- それはそうと撃墜ポイントだ。
- オーバーフローしそうな問題ではないなぁ。
- 他に撃墜ポイントも見当たらない。
- ...
- ...することがなくなってしまった。
- 今更500もチェックするようなケースがない。
- 真面目に1000を考えよう。
- ...
- ...DPじゃね?
- dp[今までに見た文字数][末尾の連続して重なってる文字数][使ったwordsの種類数] = 得点
- みたいな感じで。
- ...簡単だなぁ。
- でもさすがに3分で書ける気はしない...。
- 上のDPをそのまま書くとMLEなので、配列2つで頑張らないといけない。という撃墜ケースだけで満足しておこう。
Challenge Phase
- 1000を出している人が2人。片方は自分の考えと同じっぽくて、もう片方は結構違うっぽい。
- これは違う方をランダム爆撃するしかないね!
- 失敗...
- 結局違うほうがSystem Testに通って、自分のと同じ(っぽい)方がSystem Testに落ちました。そんなぁ。
- 他にはchallengeできずに終了。
System Test
- oox -25.0 470.94 1516 -> 1566
- 初めて500を通した。やったー。
- まぁ今回の500は250と言っても差し支えない難易度だったけど。
- 初めて500を通した。やったー。
- 今日は500を開かずに1000から行くべきだったなぁ。
- いやいや、まずは500をきっちり解けるようにならなくては。