测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25219. 乐乐进入了一个神奇的糖果屋,糖果屋中有 n 个罐子,每个罐子中都有若干颗糖果。糖果屋中的主人为了欢迎远道而来的乐乐,让乐乐感受到糖果屋的甜蜜,允许乐乐拿取 k 次糖果,拿取规则如下:1)每次可以从任意一个罐子中拿取一颗糖果;2)每次拿取糖果时能够获得甜蜜值,获得的甜蜜值为拿取前这个罐子中糖果的数量。现给定两个整数 n 和 k,以及 n 个罐子中糖果的数量。已知乐乐初始的甜蜜值为 0,请计算按照规…

填空题 容易

题目描述

乐乐进入了一个神奇的糖果屋,糖果屋中有 n 个罐子,每个罐子中都有若干颗糖果。糖果屋中的主人为了欢迎远道而来的乐乐,让乐乐感受到糖果屋的甜蜜,允许乐乐拿取 k 次糖果,拿取规则如下:

1)每次可以从任意一个罐子中拿取一颗糖果;

2)每次拿取糖果时能够获得甜蜜值,获得的甜蜜值为拿取前这个罐子中糖果的数量。

现给定两个整数 n 和 k,以及 n 个罐子中糖果的数量。已知乐乐初始的甜蜜值为 0,请计算按照规则他能够获得的最大甜蜜值。

例如:

n = 3,k = 4,3 个罐子中糖果数量依次为 10,5,11,能够获得最大甜蜜值的拿取方式如下:

第一次拿取第 3 个罐子中的一颗糖果,获得的甜蜜值为 11,拿取后 3 个罐子中糖果数量依次为 10,5,10;

第二次拿取第 1 个罐子中的一颗糖果,获得的甜蜜值为 10,拿取后 3 个罐子中糖果数量依次为 9,5,10;

第三次拿取第 3 个罐子中的一颗糖果,获得的甜蜜值为 10,拿取后 3 个罐子中糖果数量依次为 9,5,9;

第四次拿取第 1 个罐子中的一颗糖果,获得的甜蜜值为 9,拿取后 3 个罐子中糖果数量依次为 8,5,9;

最终获得的最大甜蜜值为 40(11 + 10 + 10 + 9)。

输入描述:

第一行输入两个正整数 n,k(1≤n≤1000,1≤k<105),分别表示糖果屋中罐子的数量以及乐乐可以拿取糖果的次数;

第二行输入 n 个整数(1≤整数≤100),表示每个罐子中糖果的数量,整数之间以一个空格隔开。

数据保证,所有罐子的糖果总数大于 k。

输出描述:

输出一个正整数,表示乐乐能够获得的最大甜蜜值。

样例输入:

3 4
10 5 11

样例输出:

40

参考答案

import heapq n, k = map(int, input( ).split( )) candies = list(map(int, input( ).split( ))) # 最大堆(存储负值) max_heap = [] for c in candies: heapq.heappush(max_heap, -c) total = 0 for _ in range(k): # 取最大值 max_val = -heapq.heappop(max_heap) total += max_val # 放回减1后的值 if max_val - 1 > 0: heapq.heappush(max_heap, -(max_val - 1)) print(total)

答案解析

最大堆优化: 使用负值构建最小堆模拟最大堆。

贪心策略:

每次取当前最大糖果数的罐子

累加甜蜜值并减少该罐糖果数

若罐中仍有糖果则放回堆中

时间复杂度: O(klogn),满足题目约束(k ≤ 105)。

上一题 下一题