Official

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

Gemini 3.0 Flash

概要

\(N\) 人の生徒のテストの得点 \(S_i\) が与えられたとき、合格点である \(K\) 点以上の得点を取った生徒が何人いるかを求める問題です。

考察

この問題を解くためには、各生徒の得点が「\(K\) 点以上であるか」を順番に判定していく必要があります。

例えば、生徒の得点が \([60, 40, 80, 70]\) で合格点が \(60\) 点の場合を考えてみます。 - 1人目: \(60 \ge 60\) なので合格 - 2人目: \(40 < 60\) なので不合格 - 3人目: \(80 \ge 60\) なので合格 - 4人目: \(70 \ge 60\) なので合格

このように、全ての生徒に対して一度ずつ得点を確認すれば、合計の合格者数を正しく数えることができます。

制約を確認すると、生徒数 \(N\) は最大で \(2 \times 10^5\) です。1人ずつ判定を行う素朴な方法(線形探索)をとれば、計算回数は \(N\) に比例するため、実行時間制限内に十分に間に合わせることができます。

アルゴリズム

以下の手順でプログラムを実装します。

  1. 入力から生徒数 \(N\)、合格点 \(K\)、および各生徒の得点 \(S_1, S_2, \ldots, S_N\) を読み込む。
  2. 合格者数をカウントするための変数 count を \(0\) で初期化する。
  3. 各生徒の得点 \(S_i\) について、以下の処理を \(N\) 回繰り返す。
    • もし \(S_i \ge K\) ならば、count に \(1\) を加える。
  4. 最終的な count の値を出力する。

計算量

  • 時間計算量: \(O(N)\) 各生徒の得点を \(1\) 回ずつ確認するため、生徒の人数 \(N\) に比例した時間がかかります。
  • 空間計算量: \(O(N)\) 入力された \(N\) 個の得点をリストとして保持するため、メモリ使用量は \(N\) に比例します。

実装のポイント

  • 効率的な入力: Pythonで \(N\) が大きい(\(10^5\) 程度以上)場合、input() を何度も呼び出すよりも sys.stdin.read().split() などを使って一括で入力を取得するほうが高速です。

  • 比較演算子: 「\(K\) 点以上」を判定するためには、>(より大きい)ではなく >=(以上)を使用します。

    ソースコード

import sys

def main():
    # 入力を取得
    input_data = sys.stdin.read().split()
    if not input_data:
        return
    
    # N: 生徒の人数, K: 合格点
    n = int(input_data[0])
    k = int(input_data[1])
    
    # 各生徒の得点
    scores = map(int, input_data[2:])
    
    # 合格者の人数をカウント
    count = 0
    for s in scores:
        if s >= k:
            count += 1
            
    # 結果を出力
    print(count)

if __name__ == "__main__":
    main()

この解説は gemini-3-flash-preview によって生成されました。