A - 成長するスライム / Growing Slime 解説 by admin
GPT 5.2 High概要
部屋を順に進み、現在の強さ以下のモンスターだけを吸収して強さを増やしていくとき、最後のスライムの強さを求める問題です。
考察
この問題のポイントは、スライムの行動が 「部屋 \(1\) から \(N\) まで順番に見る」 ことに完全に固定されている点です。
つまり、各部屋で必要なのは次の判定だけです:
- もし \(V_i \leq\) 現在の強さ なら吸収して強さが \(+\) \(V_i\)
- そうでなければ何も起きない(通り過ぎる)
ここで「吸収できなかったモンスターを後で戻って吸収する」などの行動はできませんし、順序を変えることもできません。したがって、各部屋の処理はその時点の強さだけで決まり、シミュレーション(逐次処理)をそのまま行えば正解です。
素朴というより「そのままの実装」が最適で、変に工夫して探索や並べ替えをすると逆に条件(順番固定)を壊してWAの原因になります。
例: - 初期 \(W=10\), モンスター \([3, 15, 7]\) - \(3 \le 10\) なので吸収 → \(W=13\) - \(15 > 13\) なので吸収できない → \(W=13\) - \(7 \le 13\) なので吸収 → \(W=20\) - 答えは \(20\)
アルゴリズム
- 現在の強さ
curを初期値 \(W\) で初期化する。 - \(i=1\) から \(N\) まで順にモンスターの強さ \(V_i\) を見る。
- もし \(V_i \le cur\) なら
cur += V_iとして吸収する。 - 最後に
curを出力する。
この手順は問題文の挙動をそのまま再現したシミュレーションです。
計算量
- 時間計算量: \(O(N)\)(各モンスターを1回ずつ見るだけ)
- 空間計算量: \(O(1)\)(入力配列を除けば、保持するのは現在値のみ)
実装のポイント
\(N\) が最大 \(2 \times 10^5\) なので、Pythonでは
sys.stdin.buffer.read()でまとめて読み込むと安定して高速です。強さは最大で加算により大きくなりますが、Pythonの整数はオーバーフローしないので安心して加算できます。
条件は \(V_i \le cur\)(等号を含む)である点に注意します。
ソースコード
import sys
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
N, W = data[0], data[1]
V = data[2:2+N]
cur = W
for x in V:
if x <= cur:
cur += x
print(cur)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
投稿日時:
最終更新: