A - 合格基準 / Passing Criteria 解説 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\) です。一人ひとりの判定は単純な比較で行えるため、すべての生徒を順番にチェックする素朴なアプローチ(線形探索)で十分に制限時間内に間に合います。
アルゴリズム
- 入力から \(N, S, T\) および点数のリスト \(A\) を受け取ります。
- 合格者数をカウントするための変数
countを \(0\) で初期化します。 - \(N\) 人の点数を一つずつ確認するループを回します。
- 各点数 \(A_i\) について、絶対値を計算する関数(Pythonでは
abs())を用いて \(|A_i - S|\) を計算します。 - その値が \(T\) 以下であれば、
countを \(1\) 増やします。
- 各点数 \(A_i\) について、絶対値を計算する関数(Pythonでは
- 最終的な
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 によって生成されました。
投稿日時:
最終更新: