公式

A - 合格基準 / Passing Criteria 解説 by admin

GPT 5.2 High

概要

基準点 \(S\) からの差が \(T\) 以内(\(|A_i-S|\le T\))である生徒を「合格」として数え、その人数を求める問題です。

考察

各生徒について「合格かどうか」は \(A_i\) だけで独立に判定できます。
したがって、全員の点数を1回ずつ見て、条件 \(|A_i-S|\le T\) を満たす人数を数えれば十分です。

例えば \(S=50, T=5\) のとき、 - \(A_i=47\)\(|47-50|=3 \le 5\) なので合格 - \(A_i=60\)\(|60-50|=10 > 5\) なので不合格
というように、絶対値の条件をそのまま判定すればよいです。

制約は \(N \le 2\times 10^5\) なので、\(O(N)\) の1回走査なら十分間に合います(逆に、全組み合わせなど無駄に重い処理をすると間に合いません)。

アルゴリズム

  1. 入力として \(N,S,T\) と配列 \(A\) を受け取る。
  2. カウンタ ans=0 を用意する。
  3. 各点数 \(A_i\) について、もし \(|A_i-S|\le T\) なら ans を1増やす。
  4. 最後に ans を出力する。

コードでは sum(1 for x in A if abs(x - S) <= T) として、条件を満たす要素数をまとめて数えています。

計算量

  • 時間計算量: \(O(N)\)(全員を1回ずつ判定)
  • 空間計算量: \(O(N)\)(点数列 \(A\) を保持するため。読みながら数える実装にすれば \(O(1)\) にも可能)

実装のポイント

  • 判定条件は必ず絶対値を使って \(|A_i-S|\le T\) をそのまま書く(abs(A_i - S) <= T)。

  • 入力が最大 \(2\times 10^5\) 要素あるため、Pythonでは sys.stdin.buffer.read() でまとめて読み込むと安定して高速です。

    ソースコード

import sys

def main():
    data = list(map(int, sys.stdin.buffer.read().split()))
    N, S, T = data[0], data[1], data[2]
    A = data[3:3+N]
    ans = sum(1 for x in A if abs(x - S) <= T)
    print(ans)

if __name__ == "__main__":
    main()

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

投稿日時:
最終更新: