Official

B - 試験の合格者 / Exam Passers Editorial by admin

GPT 5.2 High

概要

合格範囲 \([L, R]\) に入る生徒の中から、得点が最大の生徒の出席番号(同点なら最小番号)を求める問題です。合格者がいなければ -1 を出力します。

考察

  • 求めたいのは「合格者の中での最大得点」と「そのときの最小の出席番号」です。
  • 各生徒の得点は \(0 \sim 100\) と小さいですが、\(N\) は最大 \(2\times 10^5\) なので、全員を1回ずつ見る \(O(N)\) の方法が十分高速です。
  • 「最大得点の人を探す」問題は、走査しながら現在の最良(最大)を更新していくのが定石です。
  • 同点処理(最大得点が複数人いる場合は出席番号が最小)については、同点のときに更新しなければ最初に見つかった人(=出席番号が小さい人)が残ります。
    • 例:合格範囲内の得点が [80(1番), 90(2番), 90(3番)] のとき
      2番で最大が90になり、3番は同点なので更新しなければ答えは2番のままになります(最小番号で正しい)。
  • 合格者が一人もいない場合に備えて、初期値として「まだ見つかっていない」ことを表す -1 を持っておくとシンプルです。

アルゴリズム

  1. best_score = -1, best_idx = -1 で初期化する(まだ合格者を見つけていない状態)。
  2. 生徒を \(i = 1 \ldots N\) の順に見ていく。
  3. 得点 score が合格範囲 \(L \le score \le R\) を満たすときだけ候補とする。
  4. その scorebest_score より大きいなら、best_score = score, best_idx = i に更新する。
    • score == best_score のときは更新しないことで、より小さい出席番号が残る。
  5. 最後に best_idx を出力する(見つからなければ -1 のまま)。

計算量

  • 時間計算量: \(O(N)\)(全員を1回ずつ確認するだけ)
  • 空間計算量: \(O(1)\)(最良値とインデックスなど定数個の変数のみ)

実装のポイント

  • 出席番号は \(1\) 始まりなので、enumerate(P, 1) のようにして \(1\) から数えるとミスを防げます。

  • 同点の場合に最小番号を優先するため、更新条件は score > best_score のみにします(>= にしない)。

  • 合格者がいないケースに対応するため、best_idx-1 で初期化してそのまま出力できるようにしておきます。

    ソースコード

import sys

def main():
    data = list(map(int, sys.stdin.buffer.read().split()))
    if not data:
        return
    N, L, R = data[0], data[1], data[2]
    P = data[3:3+N]

    best_score = -1
    best_idx = -1

    for i, score in enumerate(P, 1):
        if L <= score <= R:
            if score > best_score:
                best_score = score
                best_idx = i

    print(best_idx)

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

posted:
last update: