公式

C - お買い物マラソン / Shopping Marathon 解説 by harurun4635


\(A_i,B_i\) はすべて正なので、尺取り法を用いることができます。

右端 \(r\) を右に動かしながら、区間 \([l,r]\) に含まれる商品の価格の合計を管理します。

価格の合計が \(K\) を超えた場合は、\(K\) 以下になるまで左端 \(l\) を右に動かします。

\(A_i\) はすべて正なので、この区間が固定した \(r\) に対して満足度の合計が最大の区間です。したがって、各 \(r\) についてこの満足度の合計を求め、その最大値を取ればよいです。

計算量は \(O(N)\) です。


n, k = map(int, input().split())
a = [0] * n
b = [0] * n

l = 0
sa = 0
sb = 0
ans = 0

for r in range(n):
    a[r], b[r] = map(int, input().split())
    sa += a[r]
    sb += b[r]

    while sb > k:
        sa -= a[l]
        sb -= b[l]
        l += 1

    ans = max(ans, sa)

print(ans)

投稿日時:
最終更新: