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 では入力方法が遅いと(環境によっては)時間が厳しくなる可能性があるため、高速入力を使うのが安全です。
アルゴリズム
- \(N, K\) を読み込む。
- \(N\) 個の点数 \(S_1,\dots,S_N\) を順に見て、\(S_i \ge K\) ならカウントを 1 増やす。
- 最終的なカウントを出力する。
実装では 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: