A - 合格者数 / Number of Successful Applicants 解説 by admin
Claude 4.5 Opus概要
\(N\) 人の生徒のテスト得点が与えられたとき、\(K\) 点以上を取った生徒(合格者)の人数を数える問題です。
考察
この問題は非常にシンプルで、以下のことに気づけば解けます。
- 重要な気づき: 各生徒について「得点が \(K\) 点以上かどうか」を判定し、条件を満たす人数をカウントすればよい
- 素朴なアプローチで十分: この問題では \(N \leq 2 \times 10^5\) であり、全生徒を1回ずつ確認するだけなので、単純なループで十分高速に解ける
- 複雑なアルゴリズムは不要: ソートや二分探索などは必要なく、線形探索で解ける
具体例
例えば、\(N = 5\)、\(K = 60\)、得点が \([45, 60, 72, 58, 80]\) の場合: - 生徒1: 45点 → 不合格(\(45 < 60\)) - 生徒2: 60点 → 合格(\(60 \geq 60\)) - 生徒3: 72点 → 合格(\(72 \geq 60\)) - 生徒4: 58点 → 不合格(\(58 < 60\)) - 生徒5: 80点 → 合格(\(80 \geq 60\))
よって、合格者は 3人 となります。
アルゴリズム
- \(N\) と \(K\) を入力から読み取る
- \(N\) 人分の得点リスト \(S\) を読み取る
- リスト \(S\) の各要素について、\(K\) 以上であれば1を、そうでなければ0を数える
- その合計(= 合格者数)を出力する
Pythonでは、ジェネレータ式と sum() 関数を組み合わせることで、簡潔に書けます:
sum(1 for s in S if s >= K)
これは「\(S\) の各要素 \(s\) について、\(s \geq K\) ならば1を生成し、それらの合計を求める」という意味です。
計算量
- 時間計算量: \(O(N)\)
- 各生徒の得点を1回ずつ確認するため
- 空間計算量: \(O(N)\)
- 得点リスト \(S\) を格納するため
実装のポイント
比較演算子に注意: 問題文では「\(K\) 点以上」が合格条件なので、
>=(以上)を使う。>(より大きい)と間違えないことPythonの便利な書き方:
sum(1 for s in S if s >= K)は、リスト内の条件を満たす要素の個数を数える定番のイディオム。len([s for s in S if s >= K])でも同じ結果が得られるが、メモリ効率はジェネレータ式の方が良いソースコード
N, K = map(int, input().split())
S = list(map(int, input().split()))
print(sum(1 for s in S if s >= K))
この解説は claude4.5opus によって生成されました。
投稿日時:
最終更新: