公式
A - 的当てゲーム / Target Shooting Game 解説 by admin
GPT 5.2 High概要
各ボールは重さ \(D_i\) だけ飛ぶので、距離が的の範囲 \([L-W,\, L+W]\) に入るボールの個数を数える問題です。
考察
- ボールの重さ \(D\) のボールを投げると「ちょうど距離 \(D\)」だけ飛ぶとあるため、ボールが落ちる位置=重さとみなせます。
- 的に当たる条件は「落ちた距離が \(L-W\) 以上 \(L+W\) 以下」なので、各 \(D_i\) について
- \(L-W \le D_i \le L+W\) を満たすかどうかを判定すればよいです。
- \(N \le 2\times 10^5\) なので、全てのボールを1回ずつチェックする素朴な全探索 \(O(N)\) で十分間に合います。
- 逆に、無理にソートして二分探索する方法も可能ですが(\(O(N\log N)\))、今回は不要です。条件判定だけで答えが出ます。
例:
- \(L=10,\ W=2\) のとき的の範囲は \([8,12]\)
- \(D=[3,8,10,13,12]\) なら、当たるのは \(8,10,12\) の3個です。
アルゴリズム
- 的に当たる距離の下限 \(low = L-W\)、上限 \(high = L+W\) を計算する。
- 各ボールの重さ \(D_i\) について、\(low \le D_i \le high\) を満たすならカウントする。
- カウントを出力する。
計算量
- 時間計算量: \(O(N)\)(各 \(D_i\) を1回ずつ判定)
- 空間計算量: \(O(1)\)(入力配列を除く追加領域)
実装のポイント
判定は 両端を含む(「以上」「以下」)なので、条件は
low <= x <= highとします。\(L, W, D_i\) は最大 \(10^9\) ですが、Python の整数ならオーバーフローを気にせず扱えます。
入力が大きいので
sys.stdin.readlineを使うと安全です。ソースコード
import sys
def main():
input = sys.stdin.readline
N, L, W = map(int, input().split())
D = list(map(int, input().split()))
low = L - W
high = L + W
ans = sum(1 for x in D if low <= x <= high)
print(ans)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
投稿日時:
最終更新: