最优清零方案 蓝桥杯 2138 python实现
问题描述
给定一个长度为 N 的数列 A1,A2,⋯,AN 。现在小蓝想通过若干次操作将 这个数列中每个数字清零。
每次操作小蓝可以选择以下两种之一:
- 选择一个大于 0 的整数, 将它减去 1 ;
- 选择连续 K 个大于 0 的整数, 将它们各减去 1 。
小蓝最少经过几次操作可以将整个数列清零?
输入格式
输入第一行包含两个整数 N 和 K 。
第二行包含 N 个整数 A1,A2,⋯,AN 。
输出格式
输出一个整数表示答案。
样例输入
4 2
1 2 3 4
样例输出
6
这道题是十三届省赛蓝桥杯的最后一题
思路:这道题我们可以用一个滑动窗口,窗口的长度为k,从A1--A1+k-1,一直滑到An,在每个滑动窗口给窗口中每个位置上的数值减去窗口内的最小值,即A1-Ai,A2-Ai......A1+K-1-Ai,Ai为这个窗口中的最小值,然后给count+Ai。最后再统计剩下位置的剩余数字之和sum,输出sum+count即可
n,k=map(int,input().split())
a=[int(i) for i in input().split()]
count=0#计数
i=0
while i<n-k+1:
c =min(a[i:i+k])#c为滑动窗口内的最小值
if c!=0:
for j in range(i,i+k):#滑动窗口内的所有数都减去c
a[j]-=c
if a[j]==0:#当有一个位置减c为0时,说明这个位置就是滑动窗口内的最小值,下一个滑动窗口从它的下一个位置开始
i=j+1
for i in range(n):
if a[i]!=0:
count+=a[i]
print(cnt)