公式
B - 散水スプリンクラー / Irrigation Sprinkler 解説
by
B - 散水スプリンクラー / Irrigation Sprinkler 解説
by
harurun4635
最大化するのは「水やりできる花の本数」です。
スプリンクラーの位置としては \(s=X_i\) の形だけを考えれば十分です。そうでない場合も、\(s\le X_i\) を満たす最小の \(X_i\) まで \(s\) を右に動かしても、それまで水やりできていた植え込みはすべて水やりできます。
\(s=X_l\) としたとき、水やりできる植え込みは \(X_l\le X_r<X_l+D\) を満たす連続した区間になります。
したがって、尺取り法を用いて \(X_r-X_l<D\) を満たす区間に含まれる \(P_i\) の和の最大値を求めればよいです。最後に全体の花の本数からこの最大値を引いたものが答えです。
計算量は \(O(N)\) です。
実装例
n, d = map(int, input().split())
x = [0] * n
p = [0] * n
for i in range(n):
x[i], p[i] = map(int, input().split())
ans = 0
s = 0
l = 0
for r in range(n):
s += p[r]
while x[r] - x[l] >= d:
s -= p[l]
l += 1
ans = max(ans, s)
print(sum(p) - ans)
投稿日時:
最終更新: