合并果子 哈夫曼树 2022.3.9

123 阅读1分钟

考研算法

题目

题目链接

题目要求

实际为不断地对最小的两个数相加
与哈夫曼编码原理相同

代码

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    priority_queue<int,vector<int>,greater<int>> h;
    while (n--)
    {
        int x;
        scanf("%d",&x);
        h.push(x);
    }
    int res=0;
    while (h.size()>1)
    {
        int a=h.top();
        h.pop();
        int b=h.top();
        h.pop();
        res+=a+b;
        h.push(a+b);
    }
    cout<<res;
}
n=int(input())
lis=list(map(int,input().split()))
lis.sort()
sum=0
for i in range(n-1):
    lis[i+1]=lis[i+1]+lis[i]
    sum+=lis[i+1]
    lis.sort()
print(sum)

知识点

queue

C++封装好的容器,可以实现自动排序

#include <queue> //头文件queue主要包括循环队列queue和优先队列priority_queue两个容器。

主要类型
queue<int> q;
struct rec{…}; queue<rec> q;      //结构体rec中必须定义小于号
priority_queue<int> q;        // 大根堆
priority_queue<int, vector<int>, greater<int> q;     // 小根堆
priority_queue<pair<int, int>>q;

循环队列 queue
      push 从队尾插入
      pop 从队头弹出
      front 返回队头元素
      back 返回队尾元素
      
优先队列 priority_queue
      push 把元素插入堆
      pop 删除堆顶元素
      top 查询堆顶元素(最大值)

小根堆表示元素小的优先级在堆顶,大根堆相反
priority_queue优先级队列总结 - zqlucky - 博客园 (cnblogs.com) (1条消息) priority_queue<int,vector,greater>优先队列 按照由小到大顺序_Annfan123的博客-CSDN博客