思路:定长滑动窗口+贪心。我们要让每个滑动窗口的值都并且操作数最少,那就主要操作窗口中靠近右侧的元素。为什么?因为越靠近右侧的元素,在我们向右滑动窗口时,更容易被保留下来,也就会产生更大的贡献。
因此,我们就滑动窗口,当发现窗口中的和
时,就累加操作数
,然后从窗口右端开始往左端,对元素进行减操作,修改元素值。这里我理解错了题意,题目说的是输入数据
,我就下意识以为操作后的每个盒子,其糖果数也必须
,这里调了挺久,其实是可以变成0的。
最后,输出累加后的操作数即可,他的时间复杂度应该是
,但能过就很神秘
代码:
import sys
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def GMI():
return map(lambda x: int(x) - 1, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n, m, x = LII()
a = LII()
op = s = 0
for r, v in enumerate(a):
s += v
if r < m - 1:
continue
if s > x:
diff = s - x
op += diff
i = r
while i >= r - m + 1 and diff > 0:
if diff > a[i]:
diff -= a[i]
s -= a[i]
a[i] = 0
else:
a[i] -= diff
s -= diff
diff = 0
i -= 1
s -= a[r - m + 1]
print(op)
t = 1
# t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号