Official

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

Claude 4.5 Opus

概要

各生徒の点数が基準点から許容範囲内かどうかを判定し、合格者の人数を数える問題です。

考察

この問題では、各生徒について「合格条件を満たすかどうか」を個別にチェックすれば良いことがわかります。

合格条件は \(|A_i - S| \leq T\) です。これは「生徒の点数 \(A_i\) と基準点 \(S\) の差の絶対値が \(T\) 以下」という意味です。

具体例で理解する

例えば、基準点 \(S = 70\)、許容される差 \(T = 5\) の場合: - 点数が \(68\) 点 → \(|68 - 70| = 2 \leq 5\)合格 - 点数が \(75\) 点 → \(|75 - 70| = 5 \leq 5\)合格 - 点数が \(64\) 点 → \(|64 - 70| = 6 > 5\)不合格

つまり、\(65\) 点から \(75\) 点の範囲に入っていれば合格となります。

この問題のポイント

  • 各生徒を1人ずつ確認すれば十分
  • 特別なアルゴリズムは不要で、単純なループで解ける
  • \(N \leq 2 \times 10^5\) という制約から、\(O(N)\) の解法で十分間に合う

アルゴリズム

  1. 入力を受け取る(\(N, S, T\) と生徒の点数リスト \(A\)
  2. 合格者数をカウントする変数を用意
  3. 各生徒の点数 \(A_i\) について、\(|A_i - S| \leq T\) を満たすかチェック
  4. 条件を満たす場合、カウントを1増やす
  5. 最終的なカウントを出力

Pythonでは、ジェネレータ式と sum 関数を組み合わせることで、シンプルに書けます:

count = sum(1 for a in A if abs(a - S) <= T)

これは「条件を満たす要素1つにつき1を足す」という処理を行い、結果的に条件を満たす要素の個数が得られます。

計算量

  • 時間計算量: \(O(N)\)
    • \(N\) 人の生徒それぞれについて1回ずつ判定を行うため
  • 空間計算量: \(O(N)\)
    • 生徒の点数を格納するリストに \(N\) 個の要素を保持するため

実装のポイント

  • 絶対値の計算には abs() 関数を使うと簡潔に書ける

  • abs(a - S) <= T という条件は、S - T <= a <= S + T と同値だが、絶対値を使う方が問題文の条件をそのまま表現できて間違いにくい

  • リスト内包表記やジェネレータ式を使うと、カウント処理を1行で書ける

    ソースコード

N, S, T = map(int, input().split())
A = list(map(int, input().split()))

count = sum(1 for a in A if abs(a - S) <= T)
print(count)

この解説は claude4.5opus によって生成されました。

posted:
last update: