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なのにこんな簡単でいいのか?
      • いいよね。きっと。
  • ? の周り 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を開かずに1000から行くべきだったなぁ。
    • いやいや、まずは500をきっちり解けるようにならなくては。