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"; } };