公式

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 となります。

アルゴリズム

  1. 最初の段差 \(A_0\) を体力の合計に加える(これは常に通常の消費)。
  2. 2番目以降の段差について、前段差との比較を行う:
    • もし \(A_i > A_{i-1}\) なら、\(2 \times A_i\) を合計に加える。
    • それ以外なら、\(A_i\) をそのまま加える。
  3. 全ての段差を処理したら、その合計を出力する。

計算量

  • 時間計算量: \(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 によって生成されました。

投稿日時:
最終更新: