FIFO队列和优先队列
使用他们必须包含 queue 头文件。
定义FIFO队列
queue<类型名> 变量名
queue<int> que //定义que为一个int类型的FIFO队列
queue<char> a //定义 a 为一个char 类型的FIFO队列
queue<data> c //定义c为一个data类型的FIFO队列
//其中data为自定义的数据类型,可以为结构体
定义简单的优先队列
priority_queue <int> heap; //定义heap为一个int类型的优先队列
priority_queue <double> k; //定义k为一个double类型的优先队列
这两种定义方式都是大根堆,想要使其变成小根堆,可以将每个数据都乘以-1
定义结构体的优先队列
struct data{
int x;
bool operator < (const data & a)const //const一定要写
{
return a.x<x; //等于小根堆
}
};
priority_queue <data>q; //q 优先队列的优先规则由data重载小于号决定
FIFO队列和优先队列的操作
q.empty() | 如果队列为空,则返回true,否则返回false |
q.size() | 返回队列中元素的个数 |
q.pop() | 删除队首元素,但不返回其值 |
q.front() | 返回队首元素的值,但不删除该元素(仅适用于FIFO队列) |
q.back() | 返回队尾元素的值,但不删除该元素(仅适用于FIFO队列) |
q.top() | 返回具有最高优先级的元素的值,但不删除该元素(仅适用于优先队列) |
q.push() | 对queue,在队尾压入一个新元素 对于priority_queue,在基于优先级的适当位置插入新元素 |
利用C++自带优先队列的合并果子代码:
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
priority_queue <int> que;
int main() {
int n; scanf("%d",&n);
for (int i=0,x;i<n;++i) {
scanf("%d",&x); que.push(-x);
}
int ans=0;
for (int i=1,tmp;i<n;++i) {
tmp=que.top();
ans-=que.top();
que.pop();
tmp+=que.top();
ans-=que.top();
que.pop();
que.push(tmp);
}
cout<<ans<<endl;
return 0;
}