目录
1. 题目:
给定一个长度为 N 的数列 41,42,…,AN 。现在小蓝想通过若干次操作将 这个数列中每个数字清零。
每次操作小蓝可以选择以下两种之一:
1.选择一个大于0的整数,将它减去1;
2.选择连续 区 个大于 0 的整数,将它们各减去1。
小蓝最少经过几次操作可以将整个数列清零?
输入格式
输入第一行包含两个整数 N 和 K 。
第二行包含 N 个整数 A1,A2,··,AN 。
输出格式
输出一个整数表示答案。
样例输入
4 2
1 2 3 4
样例输出
6
2. 我的代码:
import os
import sys
# 贪心算法
N, K = map(int, input().split(" "))
l = list(map(int, input().split(" ")))
result = 0
# 指针记录第一个>0的点
n_p = 0
while n_p <= len(l) - K:
# 遍历整个l
while l[n_p] <= 0: # 跟踪到第一个大于0的点
n_p += 1
if n_p > len(l) - K:
break
if n_p > len(l) - K:
break
# 先使用第二种减法(循环减去 K 个 1)
new_n_p = N
min_n = 10000000000000
for min_p in range(n_p + K - 1, n_p - 1, -1):
if l[min_p] < min_n:
new_n_p = min_p
min_n = l[min_p]
if min_n != 0: # 第二种减法
for i in range(n_p, n_p + K):
l[i] -= min_n
result += min_n
# 第一种减法
result += sum(l[n_p: new_n_p + 1])
n_p = new_n_p
result += sum(l[n_p:])
print(result)
温馨提示:min_n = 10000000000000
一定要够大,不要吝啬,我在测试的时候总是有一个是答案错误,弄半天不知道为什么,结果是初始的不够大。
小结:
关注我给大家分享更多有趣的知识,以下是个人公众号,提供 ||代码兼职|| ||代码问题求解||
添加我的公众号即可: