公式

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人 となります。

アルゴリズム

  1. \(N\)\(K\) を入力から読み取る
  2. \(N\) 人分の得点リスト \(S\) を読み取る
  3. リスト \(S\) の各要素について、\(K\) 以上であれば1を、そうでなければ0を数える
  4. その合計(= 合格者数)を出力する

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 によって生成されました。

投稿日時:
最終更新: