题目描述
给定一个长度为 N 的数列 A1, A2, · · · , AN。现在小蓝想通过若干次操作将这个数列中每个数字清零。
每次操作小蓝可以选择以下两种之一:
1. 选择一个大于 0 的整数,将它减去 1;
2. 选择连续 K 个大于 0 的整数,将它们各减去 1。
小蓝最少经过几次操作可以将整个数列清零?
输入格式
输入第一行包含两个整数 N 和 K。
第二行包含 N 个整数 A1, A2, · · · , AN。
输出格式
输出一个整数表示答案。
样例输入
4 2
1 2 3 4
样例输出
6
提示
对于 20% 的评测用例,1 ≤ K ≤ N ≤ 10。
对于 40% 的评测用例,1 ≤ K ≤ N ≤ 100。
对于 50% 的评测用例,1 ≤ K ≤ N ≤ 1000。
对于 60% 的评测用例,1 ≤ K ≤ N ≤ 10000。
对于 70% 的评测用例,1 ≤ K ≤ N ≤ 100000。
对于所有评测用例,1 ≤ K ≤ N ≤ 1000000, 0 ≤ Ai ≤ 1000000。
解决思路
这里我直接用的暴力解决方法,思路如下:
第一步:首先考虑能否连续K个数减1,一定要减到不能再减了,这是保证操作次数最少的关键;
第二步:最后考虑选择一个大于0的整数,将它减去1。
具体怎么实现,直接上代码:
N,k = map(int,input().split())
nums = list(map(int,input().split()))
count = 0
flag = True
while flag:
flag = False
# 循环遍历 有无连续k个数减一
i = 0
while i < N - k + 1:
k_list = nums[i:i + k]
# 有0 不可减
if 0 in k_list:
ind = (k - 1) - k_list[::-1].index(0) # 最后一个0的位置
i = i + ind + 1 # 下次直接从0的后一个位置开始找
continue
# 无0 连续k个数可减一
min_num = min(k_list)
flag = True
for t in range(k):
nums[i + t] -= min_num # 直接一次性减完 减到0
count += min_num
i += 1
count += sum(nums) # 无需做减一操作 直接求和就是
print(count)