【算法题】从数量最多的堆取走礼物

题目:

给你一个整数数组 gifts ,表示各堆礼物的数量。每一秒,你需要执行以下操作:

选择礼物数量最多的那一堆。

如果不止一堆都符合礼物数量最多,从中选择任一堆即可。

选中的那一堆留下平方根数量的礼物(向下取整),取走其他的礼物。

返回在 k 秒后剩下的礼物数量。

示例 1:

输入:gifts = 25,64,9,4,100, k = 4

输出:29

解释:

按下述方式取走礼物:

  • 在第一秒,选中最后一堆,剩下 10 个礼物。
  • 接着第二秒选中第二堆礼物,剩下 8 个礼物。
  • 然后选中第一堆礼物,剩下 5 个礼物。
  • 最后,再次选中最后一堆礼物,剩下 3 个礼物。
    最后剩下的礼物数量分别是 5,8,9,4,3 ,所以,剩下礼物的总数量是 29 。
    示例 2:

输入:gifts = 1,1,1,1, k = 4

输出:4

解释:

在本例中,不管选中哪一堆礼物,都必须剩下 1 个礼物。

也就是说,你无法获取任一堆中的礼物。

所以,剩下礼物的总数量是 4 。

提示:

1 <= gifts.length <= 10^3

1 <= giftsi <= 10^9

1 <= k <= 10^3

java代码:

复制代码
class Solution {
    public long pickGifts(int[] gifts, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> b - a);
        for (int gift : gifts) {
            pq.offer(gift);
        }
        while (k > 0) {
            k--;
            int x = pq.poll();
            pq.offer((int) Math.sqrt(x));
        }
        long res = 0;
        while (!pq.isEmpty()) {
            res += pq.poll();
        }
        return res;
    }
}
相关推荐
加宝的起点雷达2 小时前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业
秋天的怀念_David2 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
闻缺陷则喜何志丹5 小时前
【C++特性】四种类型转
c++·算法·类型转换
喵本喵叁肆5 小时前
用 Boosting 把弱隐私算法炼成强隐私算法(英文原题:Boosting and Differential Privacy (FOCS 2010))
算法·集成学习·boosting
GrowingIO技术社区5 小时前
CDP、行为分析、归因与营销自动化有什么区别?
数据结构·数据挖掘·数据分析
GrowingIO技术社区5 小时前
实时标签怎样验收?从数据更新到分群可用
数据结构·数据挖掘·数据分析
青梅味猪大肠5 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统