A - 合格者数の集計 / Counting the Number of Successful Applicants 解説 by admin
GPT 5.2 High概要
全クラスの全生徒の点数を読み取り、合格ライン \(K\) 点以上の人数を数えて合計を出力します。
考察
この問題でやることは非常に単純で、「各点数 \(B_{i,j}\) が \(K\) 以上かどうか」を判定して、条件を満たす個数を足し上げるだけです。クラスごとに集計しても、最終的には全体の合計が欲しいので、全点数を一度ずつ見れば十分です。
ただし制約として \(\sum A_i \le 10^6\)(最大で100万人分の点数)なので、入力サイズが大きくなります。
素朴に
input()を \(N\) 回呼ぶ- 各行を
split()して整数化する
という実装でも通ることはありますが、Pythonでは入力処理のオーバーヘッドが大きく、環境によってはTLE(時間切れ)になりやすいです。
そこで正解コードでは、sys.stdin.buffer.read() で入力全体をバイト列として一括取得し、そこから高速に整数を読み取る自前パーサ(read_int())を使っています。これにより、100万個規模の整数を扱っても安定して高速に処理できます。
(例)\(K=60\)、点数が [55, 60, 100] なら、\(60\) と \(100\) の2人が合格なので +2 します。これを全クラス分繰り返すだけです。
アルゴリズム
- \(N, K\) を読み取る。
- 答え
ans = 0を用意する。 - 各クラス \(i=1..N\) について:
- 生徒数 \(A_i\) を読み取る。
- \(A_i\) 人分の点数を順に読み取り、点数が \(K\) 以上なら
ans += 1。
ansを出力する。
ポイントは「点数を保存しない」ことです。必要なのは合格者数だけなので、読みながら数える(逐次処理)で十分です。
計算量
- 時間計算量: \(O\!\left(\sum_{i=1}^{N} A_i\right)\)(全生徒の点数を1回ずつ見るだけ)
- 空間計算量: \(O(1)\)(点数を配列に保持しないため、追加メモリは定数)
※ただし実装上buffer.read()で入力全体を保持するため、その分の入力サイズに比例するメモリは使います。
実装のポイント
入力が最大 \(10^6\) 個の点数を含むため、Pythonでは高速入力が重要です。
sys.stdin.buffer.read()+ 自前のread_int()により、空白・改行を飛ばしながら整数を高速にパースしています。read_int()の実装では、ASCIIコードで- 空白や改行(\( \le 32\))を読み飛ばす
- 数字列(\(>32\))を
num = num*10 + digitで整数化 という形にすることで、split()やint()の呼び出し回数を減らしています。
点数は \(0..100\)、\(K\) も \(0..100\) なので、比較は単純に
score >= KでOKです。ソースコード
import sys
data = sys.stdin.buffer.read()
L = len(data)
idx = 0
def read_int():
global idx
while idx < L and data[idx] <= 32:
idx += 1
num = 0
while idx < L and data[idx] > 32:
num = num * 10 + (data[idx] - 48)
idx += 1
return num
N = read_int()
K = read_int()
ans = 0
for _ in range(N):
A = read_int()
for _ in range(A):
if read_int() >= K:
ans += 1
sys.stdout.write(str(ans) + "\n")
この解説は gpt-5.2-high によって生成されました。
投稿日時:
最終更新: