Official

A - 最適な練習相手 / Optimal Practice Partner Editorial by admin

GPT 5.2 High

概要

高橋君が「勝てる部員(\(D_i \leq L\))」の中から、実力値 \(D_i\) が最大の部員(同値なら番号最小)を選び、その部員番号を出力する問題です。勝てる相手がいなければ -1 を出力します。

考察

推薦される条件は次の2段階に整理できます。

  1. 勝てる相手\(D_i \leq L\) を満たす部員のみが候補
  2. 候補の中で最適\(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

アルゴリズム

  1. best_val = -1(これまで見た「勝てる相手の中の最大実力値」)
  2. best_idx = -1(その部員番号)
  3. \(i=1..N\) について順に以下を行う
    • もし \(D_i \leq L\) かつ \(D_i > best\_val\) なら
      best_val = D_i, best_idx = i に更新
  4. 最後に 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: