公式

A - テストの採点 / Test Grading 解説 by admin

GPT 5.2 High

概要

各クラスごとに、生徒の点数が基準点 \(K\) 以上である人数を数えて出力する問題です。入力された点数を順に見て条件を満たすものをカウントします。

考察

この問題でやることは非常に単純で、「各クラスの点数列の中で \(K\) 以上の個数を数える」だけです。
たとえば \(K=60\)、あるクラスの点数が \([70, 55, 60, 10]\) なら、\(60\) 以上は \(70,60\) の2人なので答えは 2 になります。

重要なのは 入力サイズが大きい 点です。制約より \(\sum M_i \le 10^6\) なので、点数は最大で100万個読み取ります。
ここで、以下のような実装だと Python では遅くなりがちです。

  • input()\(N\) 回呼び、さらに毎回 split() して処理する
    → 行ごとの処理オーバーヘッドが大きく、TLEの原因になり得ます。

解決策は、標準入力をまとめて読み取り、整数列として高速に処理することです。
点数は保存する必要がなく、読み取った瞬間に \(K\) 以上か判定してカウントすれば十分なので、余計なメモリも使いません。

アルゴリズム

  1. sys.stdin.buffer.read() で入力全体を一括で読み込む
  2. split() して整数列にし、イテレータとして順に取り出す
  3. まず \(N, K\) を読む
  4. 各クラスについて以下を行う:
    • 生徒数 \(M_i\) を読む
    • 次の \(M_i\) 個の点数を読みながら、\(K\) 以上ならカウントを増やす
    • カウント結果を配列に保存
  5. 最後に各クラスの結果を改行区切りでまとめて出力する

計算量

  • 時間計算量: \(O\!\left(\sum_{i=1}^{N} M_i\right)\)(全点数を1回ずつ見るだけ)
  • 空間計算量: \(O(N)\)(各クラスの答えを保存する分。入力を一括で読む実装上の領域は別途必要)

実装のポイント

  • 高速入力sys.stdin.buffer.read().split() を使い、整数をイテレータで順に処理すると速いです。

  • 逐次処理:点数の配列を作らず、読み取った瞬間に >= K を判定して数えるとシンプルで省メモリです。

  • 高速出力:結果を res に文字列で貯め、最後に "\n".join(res) でまとめて出力すると効率的です。

    ソースコード

import sys

def main():
    it = iter(map(int, sys.stdin.buffer.read().split()))
    N = next(it)
    K = next(it)

    res = []
    for _ in range(N):
        m = next(it)
        cnt = 0
        for _ in range(m):
            if next(it) >= K:
                cnt += 1
        res.append(str(cnt))

    sys.stdout.write("\n".join(res))

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

投稿日時:
最終更新: