题目链接
参考资料
定义:
priority_queue<Type, Container, Functional>
这三个参数,后面两个可以省略,第一个不可以。
Type 就是数据类型
Container就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。 STL里面默认用的是vector)
Functional就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆 :
//升序队列(小顶堆)
priority_queue <int,vector<int>,greater<int> > q;
//降序队列(大顶堆)队首元素最大,从队首到队尾 降序排列
priority_queue <int,vector<int>,less<int> >q;
==priority_queue <int>q;
//greater和less是std实现的两个仿函数
(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),
这个类就有了类似函数的行为,就是一个仿函数类了)
成员函数
假设type类型为int,则:
bool empty() const 返回值为true,说明队列为空;
int size() const 返回优先队列中元素的数量;
void pop() 删除队列顶部的元素,也即根节点
int top() 返回队列中的顶部元素,但不删除该元素;
void push(int arg) 将元素arg插入到队列之中;
代码及个人理解
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<queue>
using namespace std;
int main()
{
//学习了一下别人的代码
//说一下我的理解:
//块数一定,那锯的刀数就一定,一次锯一刀,把一块分两块
//因为价钱等于据的木块的长度,那就让每次两块和最少,每次用的钱就最少,把长度大的放后据
//是哈夫曼树的思想,但是不一定要建哈夫曼树
//式子就是sum=n1+n2+n3+...+n(n-1)/始每一块n尽可能的小,总和就尽可能的小
priority_queue<int, vector<int>, greater<int>>q;
int n;
cin >> n;
int sum = 0,k;
for (int i = 0; i < n; i++)
{
cin >> k;
q.push(k);//按大小顺序入队
}
while (n>1)//需要n块,那就锯n-1刀
{
int temp_sum = 0;
temp_sum += q.top();
q.pop();
temp_sum += q.top();
q.pop();
sum += temp_sum;
q.push(temp_sum);
n--;
}
cout << sum;
}