Official
A - テストの採点 / Test Grading Editorial 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\) 以上か判定してカウントすれば十分なので、余計なメモリも使いません。
アルゴリズム
sys.stdin.buffer.read()で入力全体を一括で読み込むsplit()して整数列にし、イテレータとして順に取り出す- まず \(N, K\) を読む
- 各クラスについて以下を行う:
- 生徒数 \(M_i\) を読む
- 次の \(M_i\) 個の点数を読みながら、\(K\) 以上ならカウントを増やす
- カウント結果を配列に保存
- 最後に各クラスの結果を改行区切りでまとめて出力する
計算量
- 時間計算量: \(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 によって生成されました。
posted:
last update: