给定一个长度为N的数列A1, A2, … , AN。
现在小蓝想通过若干次操作将这个数列中每个数字清零。
每次操作小蓝可以选择以下两种之一:
没有采用什么特别的算法,就是用到一些数论的知识点
总次数
=
分段减的次数
+
一个一个减的次数
总次数 = 分段减的次数 + 一个一个减的次数
总次数=分段减的次数+一个一个减的次数
因为分段减的效率最高,所以能分段减就先分段减,最后数组中剩下的全是离散的数(被0隔开)。这些数只能一个一个减,剩下的数之和就是一个一个减的次数,而分段分段减的次数在减的过程中统计。以[1,2,3,4],K=2为例:
def lastNotZeroIndex(A,start,end):
j = start
for i in range(start,end,1):
if A[i] == 0:
j = i
return j
def bestZero(A,K):
count = 0
i = 0
while i < len(A):
if i+K <= len(A):
minElement = min(A[i:i+K])
if minElement != 0:
count += minElement
for j in range(i,i+K,1):
A[j] -= minElement
i = lastNotZeroIndex(A,i,i+K)
i += 1
return sum(A) + count
N,K = map(int,input().split(' '))
A = list(map(int,input().split(' ')))
print(bestZero(A,K))