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を持っておくとシンプルです。
アルゴリズム
best_score = -1,best_idx = -1で初期化する(まだ合格者を見つけていない状態)。- 生徒を \(i = 1 \ldots N\) の順に見ていく。
- 得点
scoreが合格範囲 \(L \le score \le R\) を満たすときだけ候補とする。 - その
scoreがbest_scoreより大きいなら、best_score = score,best_idx = iに更新する。score == best_scoreのときは更新しないことで、より小さい出席番号が残る。
- 最後に
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: