公式
A - 混雑する階段 / Steep Stairs 解説 by admin
Qwen3-Coder-480B概要
階段の各段差の高さが与えられ、前の段差より高い段差を登るときに体力消費が2倍になるルールのもとで、すべての階段を登るのに必要な体力の総和を求めます。
考察
この問題では、各段差を順に見ていくことで答えを求めることができます。
重要なのは、「前の段差より今見ている段差が大きいか」だけです。
もしそうであれば、その段差を登るために必要な体力は \(2 \times A_i\) になります。そうでなければ \(A_i\) です。
最初の段差(\(A_0\))は無条件で通常の体力消費なので、初期値として合計に加えます。
その後、2番目以降の段差について順に比較を行い、必要に応じて2倍にして加えるかそのまま加えるかを判断します。
この処理はシンプルなループで実現できるので、特に難しい考察やデータ構造は必要ありません。
素朴なシミュレーションでも十分高速であり、制約 \(N \leq 2 \times 10^5\) でも間に合います。
例えば入力が
3
2 5 3
のとき、
- 最初の段差:2 → 合計 = 2
- 2段目:5 > 2 なので 2×5 = 10 を加算 → 合計 = 12
- 3段目:3 ≦ 5 なので 3 を加算 → 合計 = 15
となり、出力は 15 となります。
アルゴリズム
- 最初の段差 \(A_0\) を体力の合計に加える(これは常に通常の消費)。
- 2番目以降の段差について、前段差との比較を行う:
- もし \(A_i > A_{i-1}\) なら、\(2 \times A_i\) を合計に加える。
- それ以外なら、\(A_i\) をそのまま加える。
- 全ての段差を処理したら、その合計を出力する。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\) (入力の配列を除く)
実装のポイント
- 配列のインデックスに注意し、
i = 0のときだけ特別扱いすること。 - 入力の受け取りと同時に処理開始できるよう、最初の要素を合計の初期値として設定するのがポイント。
## ソースコード
```python
N = int(input())
A = list(map(int, input().split()))
total_cost = A[0]
for i in range(1, N):
if A[i] > A[i - 1]:
total_cost += 2 * A[i]
else:
total_cost += A[i]
print(total_cost)
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: