Official

A - 合格者数 / Number of Successful Applicants Editorial by admin

GPT 5.2 High

概要

各生徒の点数 \(S_i\) のうち、合格基準 \(K\) 以上のものがいくつあるかを数えて出力する問題です。

考察

求めたいのは「\(S_i \ge K\) を満たす人数」だけで、点数の並び順や平均との差などは関係ありません。
したがって、各生徒の点数を 1 回ずつ見て、条件を満たしたらカウントを増やすだけで十分です。

例えば \(K=60\)、点数が \([55, 60, 80, 59]\) なら、\(60\)\(80\) の 2 人が合格なので答えは 2 です。

制約は \(N \le 2\times 10^5\) と大きいですが、1 回走査するだけなら余裕で間に合います。
逆に、ソートしてから数える(\(O(N\log N)\))のような方法でも通ることは多いですが、この問題に必要ない処理であり無駄が増えます。また、入力が大きいので、Python では入力方法が遅いと(環境によっては)時間が厳しくなる可能性があるため、高速入力を使うのが安全です。

アルゴリズム

  1. \(N, K\) を読み込む。
  2. \(N\) 個の点数 \(S_1,\dots,S_N\) を順に見て、\(S_i \ge K\) ならカウントを 1 増やす。
  3. 最終的なカウントを出力する。

実装では sum(1 for s in scores if s >= K) のように、「条件を満たす要素の個数」を合計で求めています。

計算量

  • 時間計算量: \(O(N)\)(点数を 1 回ずつ確認する)
  • 空間計算量: \(O(1)\)(点数を全て保持せずに処理できる。※入力読み込み方法によっては別途領域を使う)

実装のポイント

  • 入力が最大 \(2\times 10^5\) 個あるため、sys.stdin.buffer.read() を使ってまとめて読み込むと高速です。

  • 点数は map(int, ...) で逐次的に取り出し、条件判定して数えるだけで十分です。

    ソースコード

import sys

def main():
    data = sys.stdin.buffer.read().split()
    N = int(data[0])
    K = int(data[1])
    scores = map(int, data[2:2+N])
    ans = sum(1 for s in scores if s >= K)
    print(ans)

if __name__ == "__main__":
    main()

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

posted:
last update: