Official

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

Qwen3-Coder-480B

概要

各クラスの生徒の点数から、基準点 \(K\) 以上の人数をクラスごとに求める問題。

考察

この問題は単純な集計問題であり、各クラスのすべての生徒の点数を確認し、\(K\) 点以上であるものを数えるだけです。
制約を見ると、\(N\) は最大で \(10^5\)、各クラスの生徒数 \(M_i\) は最大で \(100\)、全体の生徒数の合計は最大で \(10^6\) となっています。
これは十分に大きいですが、全生徒を見ても間に合う範囲です(後述の計算量参照)。

素朴な実装(たとえば、入力を1行ずつ input() で受け取る)では、Pythonの標準入力が遅いため、TLE(Time Limit Exceeded)になる可能性があります。
そこで、一度にすべての入力を読み込んで処理する高速化が必要になります。

このコードでは、sys.stdin.read を使ってすべての入力を一度に読み込み、文字列リストとして処理しています。これにより、入力待ちのオーバーヘッドを回避し、高速に動作します。

アルゴリズム

  1. すべての入力を一度に読み込み、空白で分割してリストにする。
  2. 最初の2つの値を \(N\)\(K\) として取り出す。
  3. 各クラスについて以下を行う:
    • 生徒数 \(M_i\) を取得。
    • 次の \(M_i\) 個の点数を順番に見て、\(K\) 以上のものをカウント。
  4. 各クラスごとのカウント結果を出力。

たとえば入力が以下のとき:

2 70
3 80 60 90
4 50 70 80 60
  • クラス1: 点数 [80, 60, 90] → 70以上の人数は 2人
  • クラス2: 点数 [50, 70, 80, 60] → 70以上の人数は 2人

よって出力は:

2
2

計算量

  • 時間計算量: \(O(\sum_{i=1}^{N} M_i)\)
    (すべての生徒の点数を1回ずつ確認するので、全体の生徒数に比例)
  • 空間計算量: \(O(\sum_{i=1}^{N} M_i)\)
    (入力データ全体をメモリ上に保持するため)

実装のポイント

  • 高速な入力のために sys.stdin.read を使用している点が重要。
  • 入力データはすべて文字列のリストになっているため、適宜 int() で変換する必要がある。
  • インデックスを管理しながらデータを取り出す際、境界外アクセスに注意。
## ソースコード

```python
import sys
input = sys.stdin.read

def main():
    data = input().split()
    idx = 0
    N = int(data[idx])
    idx += 1
    K = int(data[idx])
    idx += 1
    results = []
    
    for _ in range(N):
        M = int(data[idx])
        idx += 1
        count = 0
        for _ in range(M):
            score = int(data[idx])
            idx += 1
            if score >= K:
                count += 1
        results.append(count)
    
    print('\n'.join(map(str, results)))

if __name__ == "__main__":
    main()

この解説は qwen3-coder-480b によって生成されました。

posted:
last update: