A - 株価の変動幅 / Stock Price Fluctuation Range 解説 by admin
Claude 4.6 Opus (Thinking)概要
\(N\) 個の銘柄それぞれについて、隣接する日の株価の差の絶対値の合計(変動幅)を計算し、変動幅が最大の銘柄番号を求める問題です。
考察
問題の理解
「変動幅」とは、株価が日ごとにどれだけ上下したかの合計です。例えば、ある銘柄の株価が \([100, 130, 110, 150]\) の4日間だった場合、変動幅は次のように計算します:
\[|130 - 100| + |110 - 130| + |150 - 110| = 30 + 20 + 40 = 90\]
アプローチ
この問題は素直にシミュレーションするだけで解けます。
- 各銘柄について変動幅を計算する → \(O(M)\)
- \(N\) 個の銘柄すべてに対して行う → \(O(NM)\)
制約が \(N \leq 100\)、\(M \leq 100\) と小さいので、\(O(NM) = O(10000)\) 程度の計算量であり、特別な工夫は不要です。TLE や WA を心配する必要はなく、定義通りに計算すれば正解できます。
同点の処理
変動幅が最大の銘柄が複数ある場合は「番号が最も小さいもの」を出力します。銘柄 \(1\) から順に見ていき、厳密に大きい場合のみ最大値を更新する(> を使う)ことで、同点のときは先に見つけた(=番号が小さい)銘柄が保持されます。
アルゴリズム
- \(N\) と \(M\) を読み込む。
- 変動幅の最大値
best_valを \(-1\) で、対応する銘柄番号best_idxを \(0\) で初期化する。 - 銘柄 \(i = 1, 2, \ldots, N\) について:
- 株価データ \(A_{i,1}, A_{i,2}, \ldots, A_{i,M}\) を読み込む。
- 変動幅 \(v = \sum_{j=1}^{M-1} |A_{i,j+1} - A_{i,j}|\) を計算する。
- もし \(v > \text{best\_val}\) ならば、
best_valを \(v\) に、best_idxを \(i\) に更新する。
best_idxを出力する。
計算量
- 時間計算量: \(O(NM)\)(各銘柄について \(M-1\) 回の差分計算を \(N\) 銘柄分行う)
- 空間計算量: \(O(M)\)(1銘柄分の株価データを保持するだけで十分)
実装のポイント
更新条件は
>(厳密な不等号)にする:>=にしてしまうと、同点の場合に番号が大きい方に更新されてしまい、「番号が最も小さいもの」という条件を満たせません。銘柄番号は 1-indexed:コード中のループ変数
iは 0 から始まるため、銘柄番号として出力する際はi + 1とする必要があります。全銘柄のデータを配列に保存する必要はなく、1銘柄ずつ読み込んで変動幅を計算・比較すれば十分です。これにより空間計算量を抑えられます。
ソースコード
N, M = map(int, input().split())
best_idx = 0
best_val = -1
for i in range(N):
A = list(map(int, input().split()))
v = sum(abs(A[j+1] - A[j]) for j in range(M-1))
if v > best_val:
best_val = v
best_idx = i + 1
print(best_idx)
この解説は claude4.6opus-thinking によって生成されました。
投稿日時:
最終更新: