公式

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 します。これを全クラス分繰り返すだけです。

アルゴリズム

  1. \(N, K\) を読み取る。
  2. 答え ans = 0 を用意する。
  3. 各クラス \(i=1..N\) について:
    1. 生徒数 \(A_i\) を読み取る。
    2. \(A_i\) 人分の点数を順に読み取り、点数が \(K\) 以上なら ans += 1
  4. 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 によって生成されました。

投稿日時:
最終更新: