https://leetcode-cn.com/problems/sell-diminishing-valued-colored-balls/
分析
很容易找到这道题的贪心策略:每次卖出价值最大(数目最多)的那种球。
我们可以使用最大堆来辅助获取最大的inventory[i]
,把它加到ans
后再把inventory[i] - 1
放回堆中,同时orders--
。这种思路很简单,但效率太低了,时间复杂度为 O ( o r d e r s ⋅ l o g n ) O(orders\cdot logn) O(orders⋅logn), n n n为球的种类。
解法一
最直观的加速方法是什么?我们可以获取到最大值inventory[i]
和次最大值inventory[j]
,然后将第i
种球卖出inventory[i] - inventory[j]
次并计算这个过程的利润。接下来会有两个最大值inventory[i] == inventory[j]
,需要再寻找次最大值inventory[k]
,然后将第i
和第j
种球都卖出inventory[i] - inventory[k]
次,并计算利润。重复这个过程直到orders == 0
,就找到了答案。
我们可以先对inventory
进行排序来帮助我们找到每一次计算的最大值和次最大值。
以示例3为例展示该算法的过程:
阶段一:[10, 8, 6, 4, 2] orders = 20
\qquad \quad 最大值10,次最大值8,有1个最大值。因此1种球卖2次,利润为1 * (10 + 9) = 19。
阶段二:[8, 8, 6, 4, 2] orders = 18
\qquad \quad 最大值8,次最大值6,有2个最大值。因此2种球分别卖2次,利润为2 * (8 + 7) = 30。
阶段三:[6, 6, 6, 4, 2] orders = 14
\qquad \quad 最大值6,次最大值4,有3个最大值。因此3种球分别卖2次,利润为3 * (6 + 5) = 33。
阶段四:[4, 4, 4, 4, 2] orders = 8
\qquad \quad 最大值4, 次最大值2,有4个最大值。因此4种球分别卖2次,利润为4 * (4 + 3) = 28。
总利润为110。
当orders
小于当前可以卖的总次数时,需要计算数目最多的那几种球分别可以卖多少次,剩余的orders
用来给这其中的某几种球再卖一次。
代码:
class Solution {
public:
in