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\) に比例するため、実行時間制限内に十分に間に合わせることができます。
アルゴリズム
以下の手順でプログラムを実装します。
- 入力から生徒数 \(N\)、合格点 \(K\)、および各生徒の得点 \(S_1, S_2, \ldots, S_N\) を読み込む。
- 合格者数をカウントするための変数
countを \(0\) で初期化する。 - 各生徒の得点 \(S_i\) について、以下の処理を \(N\) 回繰り返す。
- もし \(S_i \ge K\) ならば、
countに \(1\) を加える。
- もし \(S_i \ge K\) ならば、
- 最終的な
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 によって生成されました。