阿伟学会了一个魔法: 选择一个队列中的某个数 � � a i ,然后可以任意选择一个数 � X( � X > 0 0 ) , 让 � � a i 增加 ⌊ � � � ⌋ ⌊ X a i ⌋, 每次使用魔法会消耗 1 1 点体力,小利同学有 � k 个体力。 杰老板知道了这件事,他给了阿伟一个起始队列 � a, 里面每一个数都是 1 1, 一个目标队列 � b,和一个钱钱队列 � c 。杰哥承诺,当阿伟把 � � a i 变成了 � � b i 就会获得 � � c i 的钱钱。问阿伟在精疲力竭之前最多可以赚多少钱?
时间: 2024-02-14 13:14:34 浏览: 120
队列的最大值1
这是一个经典的贪心问题,可以使用堆或者优先队列来解决。
首先将起始队列 $a$ 中的所有数加入堆中,然后不断地取出堆顶元素,将其增加,并把增加后的结果重新放入堆中,直到体力耗尽或者堆为空为止。
具体实现时,可以使用一个结构体来维护队列中的元素值和增加次数,然后将结构体按照增加次数从小到大放入堆中。每次取出堆顶元素,增加其值,并更新增加次数,然后将其重新放入堆中。需要注意的是,当堆顶元素的增加次数已经达到了 $\lfloor\frac{b_i-a_i}{a_i}\rfloor$ 时,就不能再对其进行增加操作了。
最后,将所有已经变为目标队列 $b$ 的元素对应的钱钱队列 $c$ 中的值相加即为最多可以赚到的钱钱。
时间复杂度为 $O(n\log n)$,其中 $n$ 是队列中元素的个数。
阅读全文