考研算法
题目
题目要求
实际为不断地对最小的两个数相加
与哈夫曼编码原理相同
代码
#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博客