Official

A - 登山道の気温変化 / Temperature Changes on a Mountain Trail Editorial by admin

(非推奨) Claude 4.6 Opus (Thinking)

概要

隣り合うチェックポイント間の気温差の絶対値が基準値 \(K\) 以上となる箇所の個数を数える問題です。

考察

この問題で求められていることを整理しましょう。

  • チェックポイントは \(1\) から \(N\) まで順番に並んでいる。
  • 隣り合う2つのチェックポイント \(i-1\)\(i\) について、気温差の絶対値 \(|T_i - T_{i-1}|\)\(K\) 以上なら「急変」とみなす。
  • チェックポイント \(2\) から \(N\) までの中で、急変が起きる箇所を数える。

具体例で確認してみましょう。

例えば \(N = 5\), \(K = 3\) で気温が \([10, 8, 3, 5, 12]\) の場合:

| チェックポイント | 気温差 \(|T_i - T_{i-1}|\) | \(K = 3\) 以上? |

\(2\) $ 8 - 10
\(3\) $ 3 - 8
\(4\) $ 5 - 3
\(5\) $ 12 - 5

答えは 2 です。

この問題は特別なアルゴリズムを必要とせず、隣り合う要素を順番に比較していくだけで解けます。素朴な方法(全ペアを前から順に見る)がそのまま最適な方法です。チェックする隣接ペアは \(N - 1\) 組しかないため、1回のループで十分間に合います。

アルゴリズム

  1. \(N\)\(K\) を読み込む。
  2. 気温の列 \(T_1, T_2, \dots, T_N\) を配列に格納する。
  3. カウンタ count\(0\) で初期化する。
  4. \(i = 1, 2, \dots, N-1\) について、\(|T_i - T_{i-1}| \geq K\) ならば count\(1\) 増やす。
  5. count を出力する。

コードでは for i in range(1, N) としてインデックス \(1\) から \(N-1\) までループしています。これは隣接するチェックポイントのペア \((1,2), (2,3), \dots, (N-1, N)\) に対応します。

計算量

  • 時間計算量: \(O(N)\) — 配列を1回走査するだけです。
  • 空間計算量: \(O(N)\) — 気温をすべて配列に格納します。

\(N \leq 10^5\) なので、十分高速に動作します。

実装のポイント

  • 絶対値の計算: Python の組み込み関数 abs() を使うことで、気温が上がった場合も下がった場合も統一的に扱えます。

  • データ型: 気温 \(T_i\)\(-10^9\) 以上 \(10^9\) 以下なので、隣接する気温差の絶対値は最大 \(2 \times 10^9\) になり得ます。Python は整数のオーバーフローがないため特に心配は不要ですが、C++ などの言語では int 型(32bit)の範囲を超える可能性があるため注意が必要です。

  • ループの範囲: チェックポイント \(1\) は「直前のチェックポイント」が存在しないため、判定対象外です。ループは \(i = 1\) から開始する点に注意しましょう(0-indexed の場合)。

    ソースコード

N, K = map(int, input().split())
T = [int(input()) for _ in range(N)]
count = 0
for i in range(1, N):
    if abs(T[i] - T[i-1]) >= K:
        count += 1
print(count)

この解説は claude4.6opus-thinking によって生成されました。

posted:
last update: