A - 最適な練習相手 / Optimal Practice Partner Editorial by admin
GPT 5.2 High概要
高橋君が「勝てる部員(\(D_i \leq L\))」の中から、実力値 \(D_i\) が最大の部員(同値なら番号最小)を選び、その部員番号を出力する問題です。勝てる相手がいなければ -1 を出力します。
考察
推薦される条件は次の2段階に整理できます。
- 勝てる相手:\(D_i \leq L\) を満たす部員のみが候補
- 候補の中で最適:\(D_i\) が最大の部員を選ぶ(同じ最大値が複数なら番号が最小)
ここで重要なのは、「最大の \(D_i\) を持つ勝てる相手」を探すだけなので、全員を一度見れば十分という点です。
各部員について「勝てるか(\(D_i \leq L\))」を判定し、勝てるなら「これまでのベスト(最大 \(D\))」より強いかを比較して更新します。
同値(\(D_i\) が同じ)のときは番号最小を選ぶ必要がありますが、今回の実装では更新条件を d > best_val のみにしているため、同値では更新されず、最初に見つかった(=番号が小さい)部員が残ります。これでタイブレーク条件を自然に満たせます。
例:
- \(L=10\), \(D=[8,10,10,9]\)
勝てる中で最大は \(10\)。最初に \(10\) が出るのは部員2なので答えは 2。
アルゴリズム
best_val = -1(これまで見た「勝てる相手の中の最大実力値」)best_idx = -1(その部員番号)- \(i=1..N\) について順に以下を行う
- もし \(D_i \leq L\) かつ \(D_i > best\_val\) なら
best_val = D_i,best_idx = iに更新
- もし \(D_i \leq L\) かつ \(D_i > best\_val\) なら
- 最後に
best_idxを出力(更新されていなければ-1のままなので-1を出力)
計算量
- 時間計算量: \(O(N)\)(全員を1回ずつ見るだけ)
- 空間計算量: \(O(1)\)(追加の大きな配列を使わない。※入力配列を保持する分を除く)
実装のポイント
同値のときに更新しない(条件を
>にする)ことで、「最大値が複数なら番号最小」を自動的に満たせます。best_idxが最後まで-1のままなら、勝てる相手がいないので-1を出力します。制約が大きいので、Pythonでは
sys.stdin.buffer.read()で高速に入力を読むのが安全です。ソースコード
import sys
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
if not data:
return
N, L = data[0], data[1]
D = data[2:2+N]
best_val = -1
best_idx = -1
for i, d in enumerate(D, 1):
if d <= L and d > best_val:
best_val = d
best_idx = i
print(best_idx if best_idx != -1 else -1)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: