Official

A - Save the Monsters Editorial by maroonrk_admin


攻撃されたら常に防御,を繰り返すことで,\(\max(N+B-A,0)\) 人生き残る.

モンスター \(i\) が全体を通して攻撃される回数を \(C_i\) と置く. \(C_i\) の小さい方から \(d\) 個選んだとき,この和が \(B\) 以下なら \(d\) 体守れる.(この \(d\) 体だけを防御するような戦術を取れば良い)

上の二つの戦術が答えの下界を与えているが,実はこれが十分. 証明は帰納法でできる.

もう一つの考え方としては,攻撃が実際に起こった回数が少なければ少ないほどいい,というものがある. \(B\) 回の防御を使い切る前提では,攻撃が起こった回数を \(S\) とすると,最終的に生き残るモンスターは \(N+B-S\) 体なので,\(S\) が小さいほど嬉しい. 勇者は \(S\) を最大化するために行動するが,これは単に MP がある限り攻撃するという戦略に落ち着く. \(S = A\) のケースは,一番目の戦略に対応する. \(S<A\) のケースは,二番目の戦略に対応する. 最終的に生き残ったモンスターは,\(C_i\) 回攻撃を受けたことになり,つまり \(C_i\) 回の防御を必要とする. よって \(C_i\) の小さい方から守るのが最適になる.

全体で \(O(N+M)\) 時間で計算可能.

実装例

posted:
last update: