一.priority_queue(优先队列)
1.头文件及定义
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> q;//递增优先队列
priority_queue<int,vector<int>,greater<int> > q1;//递减优先队列
return 0;
}
2.基本函数使用
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int> q;//递增优先队列
priority_queue<int,vector<int>,greater<int> > q1;//递减优先队列
int main(){
q.push(x);//把x放入队列
q.top();//取出队头元素,但不删除
q.pop();//删除队头元素
q.size();//返回q的长度
q.empty();//判断队伍是否为空,空返回1
return 0;
}
3.优先队列使用举例
合并果子:共有n堆果子,要把他们合并成一堆。没合并两堆果子消耗两个果子数量之和的体力,现要求最少消耗的体力。
思路:每次取最少的两堆果子,将其合并后,把合并的果子再放到数组中,直到只剩一堆果子。
代码如下:
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;
int n,x;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
q.push(x);
}
int sum=0;
while(q.size()>1){
x=q.top();
q.pop();
x+=q.top();
q.pop();
sum+=x;
q.push(x);
}
cout<<sum;
return 0;
}
二.重载运算符的使用
1.定义方法(两种方法都可)
#include<iostream>
#include<queue>
using namespace std;
struct node{
int x,y,sum;
bool operator<(const node&a)const {return sum>a.sum; }
friend bool operator<(node a,node b) {return a.sum>b.sum; }
};
int main(){
return 0;
}
2.在优先队列中的用法
#include<iostream>
#include<queue>
using namespace std;
struct node{
int x,y,sum;
friend bool operator<(node a,node b) {return a.sum>b.sum; }
};
priority_queue<node> q;
int main(){
q.push({x,y,z});//放入优先队列
q.top().x,q.top().y,q.top().sum;//取出队首元素的各部分
q.pop();//删除一个元素
q.size();//返回q的长度
q.empty();//判断队伍是否为空,空返回1
return 0;
}
3.重载运算符的使用演示
题目:给两个长度为n序列,使其中任意两个数相加,求结果最小的n个数。
思路:给序列从小到大排序,前面的数一定大于后面的。
代码如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
const int N=100005;
struct node{
int x,y,sum;
node(int _x,int _y,int _sum) {x=_x,y=_y,sum=_sum; }
friend bool operator<(node a,node b) {return a.sum>b.sum; }
};
priority_queue<node> q;
int n,a[N],b[N];
map<pair<int,int>,int> mp;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
q.push({1,1,a[1]+b[1]});
while(n--){
int x=q.top().x,y=q.top().y;
cout<<q.top().sum<<" ";
q.pop();
mp[{x,y}]=1;
if(!mp[{x+1,y}]){
q.push({x+1,y,a[x+1]+b[y]});
}
if(!mp[{x,y+1}]){
q.push({x,y+1,a[x]+b[y+1]});
}
}
return 0;
}