题解 | #哈夫曼树#

哈夫曼树

https://www.nowcoder.com/practice/162753046d5f47c7aac01a5b2fcda155

需要把所有元素值的负数存入优先队列,然后每次top出2个最大的,也就是原叶子结点中2个权值最小的。

top完别忘pop,再把新节点push进优先队列,用wpl累加,最后输入wpl时别忘再乘回来-1

#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;


int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        priority_queue<int> myPriorityQueue;
        int wpl = 0;
        for (int i = 0; i < n; i++) {
            int num;
            cin >> num;
            //乘-1再入优先队列,即可巧妙运用默认的大根堆实现小根堆
            myPriorityQueue.push(num * (-1));
        }

        //wpl不断累加,退出条件是优先队列中只有一个根节点
        while (myPriorityQueue.size() > 1) {
            int small1 = myPriorityQueue.top();
            myPriorityQueue.pop();
            int small2 = myPriorityQueue.top();
            myPriorityQueue.pop();
            int newWeight = small1 + small2;
            myPriorityQueue.push(newWeight);//别忘新节点入队

            wpl = wpl + small1 + small2;
        }
        printf("%d\n",wpl*(-1));
    }
}
全部评论

相关推荐

昨天 14:22
门头沟学院 Java
大厂 测开 24*16离家近的事业编(大概只有大厂的1/4) 硕士
烟火_fy_烟火:钱多事少离家近,加上工作兴趣,感觉事业编完胜,大厂测开还得担心被裁员优化呢
点赞 评论 收藏
分享
孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务