Official

A - 合格基準 / Passing Criteria Editorial by admin

Gemini 3.0 Flash

概要

\(N\) 人の生徒の点数 \(A_i\) が与えられたとき、基準点 \(S\) との差の絶対値が \(T\) 以内である生徒(つまり \(|A_i - S| \leq T\) を満たす生徒)が何人いるかを数える問題です。

考察

この問題で求められているのは、各生徒の点数 \(A_i\) が以下の条件を満たしているかどうかを判定することです。 $\(|A_i - S| \leq T\)$

絶対値の記号を外して考えると、これは以下の範囲に点数が入っていることと同値です。 $\(S - T \leq A_i \leq S + T\)$

制約を確認すると、生徒数 \(N\) は最大で \(2 \times 10^5\) です。一人ひとりの判定は単純な比較で行えるため、すべての生徒を順番にチェックする素朴なアプローチ(線形探索)で十分に制限時間内に間に合います。

アルゴリズム

  1. 入力から \(N, S, T\) および点数のリスト \(A\) を受け取ります。
  2. 合格者数をカウントするための変数 count\(0\) で初期化します。
  3. \(N\) 人の点数を一つずつ確認するループを回します。
    • 各点数 \(A_i\) について、絶対値を計算する関数(Pythonでは abs())を用いて \(|A_i - S|\) を計算します。
    • その値が \(T\) 以下であれば、count\(1\) 増やします。
  4. 最終的な count の値を出力します。

計算量

  • 時間計算量: \(O(N)\)
    • 生徒の人数 \(N\) に対して、各生徒の判定を \(1\) 回ずつ行うため、処理時間は \(N\) に比例します。\(N = 2 \times 10^5\) であっても、現代のコンピュータでは数ミリ秒から数十ミリ秒で処理可能です。
  • 空間計算量: \(O(N)\)
    • 入力されたすべての点数をリストに格納する場合、点数の数に比例したメモリを使用します。

実装のポイント

  • 高速な入力: \(N\)\(2 \times 10^5\) と比較的大きいため、Pythonで input() を何度も呼び出すと実行時間が長くなる可能性があります。sys.stdin.read().split() を使って一括で入力を読み込むことで、効率的に処理を行うことができます。

  • 絶対値の計算: 数学的な定義通りに条件分岐(if文)で「\(A_i - S\) が正か負か」を判定しても良いですが、プログラミング言語に備わっている abs() 関数を使うと簡潔に記述できます。

    ソースコード

import sys

def solve():
    # 入力を一括で読み込み、スペース区切りで分割する
    input_data = sys.stdin.read().split()
    if not input_data:
        return
    
    # N, S, T を取得
    n = int(input_data[0])
    s = int(input_data[1])
    t = int(input_data[2])
    
    # 生徒の点数リストを取得
    a_list = input_data[3:]
    
    count = 0
    # 各生徒の点数について判定を行う
    for i in range(n):
        a_i = int(a_list[i])
        # |A_i - S| <= T かどうかをチェック
        if abs(a_i - s) <= t:
            count += 1
            
    # 結果を出力
    print(count)

if __name__ == "__main__":
    solve()

この解説は gemini-3-flash-preview によって生成されました。

posted:
last update: