mayoko’s diary

プロコンとかいろいろ。

SRM 598 div1 med: FoxAndFencing

簡単じゃない?

解法
  • ゲーム始まった直後に Ciel が勝てる(d <= mov1+rng1)なら Ciel の勝ち
  • そうでない場合に, Ciel がどこへ逃げても Liss が勝てる場合(d+mov1 <= mov2+rng2) なら Liss の勝ち
  • これ以外は, どちらかがじりじり攻めていく感じで勝つしかない
    • まず, じりじり攻めていくためには, 移動力が相手より高くないといけない
    • それでいて, かつ「自分が動いた後相手がどんなに近づいてきても攻撃に入らず, また相手がどんなに離れても自分の攻撃範囲に入る」ことが成り立てばよく, これらは(Ciel が勝つ場合は) mov1 > mov2 かつ mov1+rng1 > 2*mov2+rng2 と書ける
class FoxAndFencing {
public:
    string WhoCanWin(int mov1, int mov2, int rng1, int rng2, int d) {
        if (d <= mov1 + rng1) return "Ciel";
        if (d+mov1 <= mov2+rng2) return "Liss";
        if (mov2 > mov1) {
            if (mov2+rng2 > 2*mov1+rng1) return "Liss";
        }
        if (mov1 > mov2) {
            if (mov1+rng1 > 2*mov2+rng2) return "Ciel";
        }
        return "Draw";
    }
};