最优清零方案python蓝桥杯

先放题目:

思路:

将N个数字先排序,再分成N//K段,每段有有K个数字,如果有余数k,取排序后数字的后N//K段。这样每段数字中的第一个数正好代表能实现操作2的次数,用这段数字中的每个数字与第一个数字相减只和即可求的这段数字可实现操作1的次数。总次数等于分段数字中实现操作2的次数 + 操作1的次数 + 总数字的前k个数字之和。

实现代码:

def zero(x, y):

    for i in range(N//K):
        if (i+1) <= (N//K):
            b = x[i*K:(i+1)*K]
            a.append(b)
    for i in a:
        y += i[0]
        for j in i:
            y = y + (j - i[0])
    return y


def unzero(x, y):

    for i in m[:k]:
        y += i
    x = x[k::]
    y += zero(x, y)
    return y


n = input().split()
N = int(n[0])
K = int(n[1])
m = list(map(int, input().split()))
k = N % K
a = []
num = 0
if k == 0:
    print(zero(m, num))
if k != 0:
    print(unzero(m, num))

此文章仅做思路分享,对结果正确与否不负责任

经验分享 程序员 微信小程序 职场和发展