A - 山の頂上 / Mountain Summit 解説 by admin
Claude 4.6 Opus (Thinking)概要
数列の中で、両隣よりも厳密に高い地点(山頂)の個数を数える問題です。
考察
この問題は非常にシンプルで、各地点について「山頂」の条件を満たすかどうかを1つずつ確認すればよいです。
山頂の定義を正確に理解する:
地点 \(i\) が山頂であるとは、以下の2つの条件を同時に満たすことです: - \(A_{i-1} < A_i\)(左隣より厳密に高い) - \(A_i > A_{i+1}\)(右隣より厳密に高い)
具体例で確認:
例えば、標高データが 1 3 2 4 1 の場合(\(N = 5\)):
| 地点 \(i\) | \(A_{i-1}\) | \(A_i\) | \(A_{i+1}\) | 山頂? |
|---|---|---|---|---|
| 2 | 1 | 3 | 2 | ✅ (\(1 < 3\) かつ \(3 > 2\)) |
| 3 | 3 | 2 | 4 | ❌ (\(3 < 2\) が不成立) |
| 4 | 2 | 4 | 1 | ✅ (\(2 < 4\) かつ \(4 > 1\)) |
よって山頂は 2個 です。
注意点: - 最初の地点(\(i = 1\))と最後の地点(\(i = N\))は、両隣が存在しないため山頂にはなり得ません。 - 等号(\(=\))では山頂にならないことに注意してください。条件は厳密な不等号です。
この問題では \(N \leq 2 \times 10^5\) なので、単純に全地点を1回ずつ調べる \(O(N)\) の方法で十分高速に解けます。特別なアルゴリズムやデータ構造は不要です。
アルゴリズム
- \(N\) と標高の配列 \(A\) を入力から読み取る。
- カウンタ
countを \(0\) に初期化する。 - \(i = 1, 2, \ldots, N-2\)(0-indexed)について、以下を確認する:
- \(A[i-1] < A[i]\) かつ \(A[i] > A[i+1]\) であれば
countを \(1\) 増やす。
- \(A[i-1] < A[i]\) かつ \(A[i] > A[i+1]\) であれば
countを出力する。
※ 問題文では1-indexed で \(i = 2, 3, \ldots, N-1\) を調べますが、Pythonの0-indexedでは \(i = 1, 2, \ldots, N-2\) に対応します。
計算量
- 時間計算量: \(O(N)\) — 配列を1回走査するだけです。
- 空間計算量: \(O(N)\) — 標高データを配列として保持します。
実装のポイント
Pythonの
range(1, N - 1)は \(1\) から \(N - 2\) までを生成するため、最初と最後の地点を自然に除外できます。条件判定では
<=ではなく<と>を使い、厳密な不等号であることを忘れないようにしましょう。ソースコード
N = int(input())
A = list(map(int, input().split()))
count = 0
for i in range(1, N - 1):
if A[i - 1] < A[i] and A[i] > A[i + 1]:
count += 1
print(count)
この解説は claude4.6opus-thinking によって生成されました。
投稿日時:
最終更新: