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回のループで十分間に合います。
アルゴリズム
- \(N\) と \(K\) を読み込む。
- 気温の列 \(T_1, T_2, \dots, T_N\) を配列に格納する。
- カウンタ
countを \(0\) で初期化する。 - \(i = 1, 2, \dots, N-1\) について、\(|T_i - T_{i-1}| \geq K\) ならば
countを \(1\) 増やす。 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: