leetcode_2558 从数量最多的堆取走礼物

1. 题意

给定一个数组,每次从中取走最大的数,返回开根号向下取整送入堆中,最后计算总和。

从数量最多的堆取走礼物

2. 题解

直接用堆模拟即可

2.1 我的代码

用了额外的空间O( n )
priority_queue会自动调用make_heap() 、pop_heap()

cpp 复制代码
class Solution {
public:
    long long pickGifts(vector<int>& gifts, int k) {
        priority_queue<int, vector<int>, less<> > maxHeap(gifts.begin(), gifts.end());

        long long ans = 0;
        for ( int i = 0; i < k; ++i) {
            int p = maxHeap.top();
            if (p == 1) break;
            maxHeap.pop();
            maxHeap.push( (int) sqrt(p));
        }


        while (!maxHeap.empty()) {
            ans += maxHeap.top();
            maxHeap.pop();
        }

        return ans;
    }
};
2.2 更简的代码

直接在原数组上建堆就可以了

cpp 复制代码
class Solution {
public:
    long long pickGifts(vector<int>& gifts, int k) {
        
        make_heap(gifts.begin(), gifts.end(), less<int>());

        for ( int i = 0; i < k; ++i) {
            pop_heap(gifts.begin(), gifts.end() );
            gifts.back() = sqrt(gifts.back());
            push_heap(gifts.begin(), gifts.end());
        }


        return accumulate(gifts.begin(), gifts.end(), 0ll );
    }
};
相关推荐
春弦_9 小时前
自用算法整理二
数据结构·算法·图论
背调合规知识库9 小时前
数据授权中处理目的、方式与信息种类核验什么?方法、证据与误区
职场和发展
hetao173383710 小时前
2026-10-22~23 hetao1733837 的刷题记录
c++·算法
java_nnnn10 小时前
LeetCode刷题滑动窗口(串联所有单词的子串+最小覆盖的子串)Java
算法·leetcode·职场和发展
Navigator_Z11 小时前
LeetCode //C - 1301. Number of Paths with Max Score
c语言·算法·leetcode
Interview Aid11211 小时前
Uber Interview Process 完整指南:面试流程、OA 真题与 VO 备考
面试·职场和发展
卡卡~~11 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
企业数字化笔记12 小时前
AI视频增强后画质怎么验收?插值基线、伪细节与帧间闪烁的检查方法
人工智能·算法·音视频
学逆向的12 小时前
C 内存属性
c语言·开发语言·算法·网络安全