A - 山の頂上 / Mountain Summit 解説 by admin
gemini-3-flash-thinking概要
与えられた \(N\) 個の地点の標高データから、両隣の地点よりも標高が厳密に高い地点(「山頂」)が何個あるかを数える問題です。
考察
「山頂」の定義は、ある地点 \(i\) の標高 \(A_i\) が、その左隣の標高 \(A_{i-1}\) と右隣の標高 \(A_{i+1}\) のどちらよりも大きいこと、すなわち \(A_{i-1} < A_i\) かつ \(A_i > A_{i+1}\) を満たすことです。
この問題を解く上でのポイントは以下の通りです: - 判定の範囲: 山頂になり得るのは、両隣に地点が存在する \(1 < i < N\) の範囲(2番目から \(N-1\) 番目まで)に限られます。 - 計算量: 地点の数 \(N\) は最大で \(2 \times 10^5\) です。各地点について両隣と比較する操作は定数時間で行えるため、端から順番に確認していけば制限時間内に十分間に合います。
例えば、標高が [1, 3, 2, 4, 1] の場合:
- 2番目の「3」は、1 < 3 かつ 3 > 2 なので山頂です。
- 3番目の「2」は、3 > 2 かつ 2 < 4 なので山頂ではありません。
- 4番目の「4」は、2 < 4 かつ 4 > 1 なので山頂です。
このように、1つずつ条件を確認していく素直なアプローチで正解を導けます。
アルゴリズム
- 標高のリスト \(A\) を読み込みます。
- 山頂の個数を記録する変数
countを 0 で初期化します。 - インデックス \(i\) を 1 から \(N-2\) まで(0-indexedの場合、2番目から \(N-1\) 番目の要素まで)順に動かしながら、以下の判定を行います。
- もし \(A_{i-1} < A_i\) かつ \(A_i > A_{i+1}\) ならば、
countを 1 増やす。
- もし \(A_{i-1} < A_i\) かつ \(A_i > A_{i+1}\) ならば、
- 最終的な
countの値を出力します。
計算量
- 時間計算量: \(O(N)\)
- リストを 1 回走査するだけなので、地点の数 \(N\) に比例した時間で計算が終わります。
- 空間計算量: \(O(N)\)
- 入力された標高データをリストに格納するためのメモリが必要です。
実装のポイント
インデックスの範囲: Python の
range(1, n - 1)を使うことで、ちょうど「2番目の要素」から「後ろから2番目の要素」までを効率よくループさせることができます。比較演算子: \(A_{i-1} < A_i > A_{i+1}\) のように、Python では比較演算子を繋げて書くことも可能ですが、コードの可読性のために
andを使って明示的に条件を分けるのが一般的です。ソースコード
import sys
def solve():
input_data = sys.stdin.read().split()
if not input_data:
return
n = int(input_data[0])
a = list(map(int, input_data[1:]))
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)
if __name__ == "__main__":
solve()
この解説は gemini-3-flash-thinking によって生成されました。
投稿日時:
最終更新: