公式
A - 合格ライン / Passing Score 解説 by admin
GPT 5.2 High概要
各生徒の得点 \(A_i\) を見て、合格ライン \(X\) 未満の人数を数えて出力する問題です。
考察
求めたいのは「\(A_i < X\) を満たす生徒が何人いるか」だけなので、各得点を1回ずつ確認して条件に当てはまればカウントすれば十分です。
例えば \(X=60\), 得点が \([55, 60, 70, 10]\) なら、\(60\) 未満は \(55\) と \(10\) の2人なので答えは \(2\) です。
制約は \(N \le 2 \times 10^5\) と大きいですが、全員を1回ずつ見るだけなら \(O(N)\) で間に合います。逆に、並べ替え(ソート)してから数える方法も可能ですが、\(O(N \log N)\) と不要に重く、問題の本質(条件判定の個数を数える)から外れます。単純に「比較して数える」が最短です。
アルゴリズム
- 入力から \(N, X\) と配列 \(A\) を受け取る。
- カウンタ
ansを \(0\) に初期化する。 - 各 \(a \in A\) について、もし \(a < X\) なら
ansを \(1\) 増やす。 ansを出力する。
提示コードでは、sum(1 for a in A if a < X) により「条件を満たす要素の個数」を一度に計算しています。
計算量
- 時間計算量: \(O(N)\)(各得点を1回ずつ比較するだけ)
- 空間計算量: \(O(N)\)(得点列 \(A\) を保持するため)
実装のポイント
入力が最大 \(2 \times 10^5\) 個あるので、Pythonでは
sys.stdin.read()を使ってまとめて読み込むと高速で安全です。判定条件は「合格ライン 未満」なので、比較は \(a < X\)(\(a \le X\) ではない)に注意します。
ソースコード
import sys
def main():
data = sys.stdin.read().strip().split()
if not data:
return
N = int(data[0])
X = int(data[1])
A = list(map(int, data[2:2+N]))
ans = sum(1 for a in A if a < X)
print(ans)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
投稿日時:
最終更新: