定义
优先队列(堆) 头文件:#include< queue >
大根堆定义:priority_queue< int >pq;
小根堆定义:priority_queue< int ,vector< int >,greater< int > >pq;
(注意最后两个“>”符号不要连在一起,否则会被很多(但不是所有)编译器误认为是‘>>’运算符)操作: push() 元素入队
pop() 队首元素出队
top() 取队首元素
empty() 如果队列为空,则返回true(1),否则返回false(0) size() 返回优先队列中拥有的元素个数
来自Joe_2005
附代码
#include <queue>
#include <cstdio>
using namespace std;
priority_queue< int,vector< int >,greater< int > >q; //建立一个小根堆
int sum;
int main() {
int n;
scanf("%d", &n);
int a;
for (int i = 1; i <= n; i++) {
scanf("%d", &a);
q.push(a);
}
while (q.size() >= 2) {
unsigned int x = q.top(); q.pop(); //每次取出小的两个合并
unsigned int y = q.top(); q.pop();
sum += x + y;
q.push(x + y); //再将合并的果子放入堆中
}
printf("%d", sum);
return 0;
};