A - 登山道の気温変化 / Temperature Changes on a Mountain Trail Editorial by admin
GPT 5.4 High概要
各チェックポイント \(i\) について、ひとつ前のチェックポイント \(i-1\) との気温差の絶対値 \(|T_i - T_{i-1}|\) を調べ、これが \(K\) 以上なら「急変」として数えればよい問題です。
つまり、隣り合うチェックポイントどうしを順番に見ていくだけで答えが求まります。
考察
この問題で重要なのは、比べるべき相手は「直前のチェックポイント」だけ だという点です。
問題文では、チェックポイント \(i\) で急変が起きる条件は
\(|T_i - T_{i-1}| \geq K\)
と定義されています。
したがって、チェックポイント \(i\) ごとに必要なのは \(T_i\) と \(T_{i-1}\) の比較だけです。
例えば気温が
\(10, 13, 5, 8\)
で、\(K=4\) のとき、
- チェックポイント \(2\): \(|13-10|=3\) → 急変ではない
- チェックポイント \(3\): \(|5-13|=8\) → 急変
- チェックポイント \(4\): \(|8-5|=3\) → 急変ではない
となるので、答えは \(1\) です。
素朴な見方
気温の列を全部配列に入れてから、後で \(i=2\) から \(N\) まで順に比較しても解けます。
この方法でも \(O(N)\) なので十分高速です。
ただし、さらに気づくと、すべての気温を保存する必要すらありません。
今必要なのは「ひとつ前の気温」だけなので、
- 最初の気温を
prevに入れる - 次の気温を
curとして読む - \(|cur-prev| \geq K\) なら答えを増やす
prev = curに更新する
という流れを繰り返せばよいです。
なぜこれで十分か
各チェックポイント \(i\) の判定は、\(T_i\) と \(T_{i-1}\) の2つだけで決まります。
それより前の気温は判定に不要なので、前の値だけ持っていれば十分です。
この考え方により、入力を読みながらその場で答えを数えることができます。
アルゴリズム
- \(N, K\) を読み込む。
- 最初の気温 \(T_1\) を
prevに保存する。 - 残りの \(N-1\) 個の気温について、1つずつ
curとして読む。 - もし \(|cur - prev| \geq K\) なら、答え
ansを \(1\) 増やす。 prev = curに更新する。- 最後に
ansを出力する。
この方法では、各気温を1回ずつ見るだけで答えが求まります。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\)
実装のポイント
急変の条件は「以上」なので、判定は
>ではなく>=を使います。差の絶対値を見る必要があるので、
abs(cur - prev)を使います。この実装では気温を配列に保存せず、前回の気温だけを持ちながら処理しているため、メモリ使用量を小さくできます。
入力が最大 \(10^5\) 行あるため、Python では
sys.stdin.readlineを使うと安定して高速に読み込めます。ソースコード
import sys
def main():
input = sys.stdin.readline
N, K = map(int, input().split())
prev = int(input())
ans = 0
for _ in range(N - 1):
cur = int(input())
if abs(cur - prev) >= K:
ans += 1
prev = cur
print(ans)
if __name__ == "__main__":
main()
この解説は gpt-5.4-high によって生成されました。
posted:
last update: