SRM500

記念&追悼SRMでした。

  • -

250. MafiaGame

問題:N人がいて互いに投票しあう。まず投票する人を決めているM人が投票をし、次に残りの人が得票数が最も少ない人から1人をランダムに選び投票する。最多票が同率のときは残り1人になるまで決選投票を行うとき、最後の1人になる確率が最も高い人の確率は?

  • 問題文長いなぁ…。
  • 問題の意味を理解するも解法がなかなか見えない。
  • 冷静に考えたらM人の投票で2票以上入る人しか最初の投票で残らなくね?
    • M人投票した時点で0票の人が多くてもN-M人しかいない。
    • 残り票はこの人達で全部消費される。
    • M人の投票で2票以上がいなければ全員に1票になって無限ループ
  • しかもM人の投票で最多票じゃなければ最初の投票で残らない。
    • 他の票が0票の人たちで全部消費されるので、追いつくことはありえない。
  • 2回目に残る人に差異はないし、決着がつくなら(1.0/2回目の残り人数)が答えっぽい。
  • 決着がつくかの判定は…。
    • 投票に自由度がある人の人数が残り人数で割りきれたら無限ループに入る。
    • そうでなければ、割った余りの人数が次の投票に残る。
    • ので、無限ループをチェックしつつ残り1人になるまでシミュレーションする。
  • という感じで書いてみたらサンプル通ったので、提出。時間かかったな…。

500. FractalPicture

問題:与えられるフラクタル図形の500番目の図形のうち、(x1,y1)、(x2,y2)を頂点にもつ長方形に入る線分の長さの総和を求める。

  • また問題文なげー。しかも実装めんどくさそう…。
  • 再帰で書いたら楽そうだけど、500回分重ねるのは誤差が怖い。
  • とりあえず、再帰しながら1x1のブロック単位でチェックする方針に。
  • まず、finalの線分について長さ1単位で長方形内にあるかチェック。
    • 間に合うし、まぁいいかという事で。
  • nonfinalの線分3本について再帰的に処理。
  • 深さ5のところで関数に渡される線分の長さが1になる。
  • ここで与えられた線分の右側・左側に生成される全ての線分は1x1のブロックに入る。
  • この長さの和って厳密に計算できたりは…。
    • 与えられた線分の長さは1
    • 次は長さ1/3の線分が2本生成される
    • 次は長さ1/9の線分が6本生成される
    • 次は長さ1/27の線分が18本生成される
    • n回目で、長さ3-nの線分が2*3^n-1本生成されて、長さの総和は2/3…?
  • 長さ1の時点で5番目の図形なので、あと495回展開される。
    • よって展開される線分の長さの総和は495*2/3になり、片側で495/3 = 165。
  • なので、深さ5のところでは線分の左右のブロックが長方形内にあれば165を足す。
  • ってやったらサンプルが通り、最大ケースも正しそうだったので提出。
  • -

結果:AC / AC / -- ,412.50pt, 21位
レーティング:2193 -> 2308


何とかどちらも通り、ついに念願のレッドコーダーになることができました。
部屋の500は、俺の以外が誤差で落ちてたので、495/3について説明を求められたりも。
訳の分からない英語を書いてみましたが、ギリギリ通じたっぽいので安心もしました。


また、部屋1位だったので私の分の賞金はrem氏の遺族に寄付となりました。
ご冥福をお祈りします。