优先队列
优先队列,是,一个跟单调队列一样神奇的数据结构。
手写优先队列不会,只能用STL库自带的priority_queue。
声明priority_queue的头文件
#include<queue>或#include<bits/stdc++.h>
定义
priority_queue<int,vector<int>,less<int>> a; //less<int>递增函数
priority_queue<int,vector<int>,greater<int> >q;//depue双端队列,greater<int>递减函数
priority_queue<int>a;
priority_queue<double>a;
---------------------------------------------------
struct node{
~~~~~
}
priority_queue<node>a;
--------------------------------------------------
priority_queue的操作
实际上就是那些:
priority_queue<int>q;
q.empty()——队列是否为空,空为true,否则为false
q.pop()——删除队顶元素
q.push()——压入一个元素
q.size()——返回优先队列中的元素个数
q.top()——返回q的第一个元素
priority_queue的排序方式
priority_queue<int> q;//优先队列自带排序,元素从大到小的顺序排序出队
priority_queue<int,vector<int>, greater<int> > q;//greater<int>,按照元素从小到大的顺序排序出队
struct cmp{
int x,y;
bool operator< (const node & a)const{
return x<a.x;
}
};//自定义结构体,重载<;
priority_queue<int,vector<int>,less<int> > a;//less排序从大到小
priority_queue<int,vector<int>,greater<int> >a; //greater排序从小到大
//less和greater后的两个>之间要打" ",不然错哪里都不知道~~(绝对没有体验过)~~
所以,优先队列实际上就是一个自带从大到小排序的队列,最大元素会排在队首,然后,跟队列一样先进先出(感觉比单调队列半路插队要好写一些?)
那就做一道例题吧(绝对没有滑动窗口的普及+/提高)
P3887 [GDOI2014]世界杯
读题可知,这道题有四个综合水平值,说明了什么?
当然是开四个优先队列啦(逃
#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>, less<int> > k,d,m,f;//根据题目开的四个优先队列,也可以打四次priority_queue<int,vector<int>, less<int> >,不然考试背不到priority_queue就完了
int q;
int a,b,c,e;//守门员、后卫、中场和前锋供挑选的球员人数
int main(){
int cnt;//存储
cin >> a>>b>>c>>e;
for(int i=1;i<=a;i++){
cin >> cnt;
f.push(cnt);
}
for(int i=1;i<=b;i++){
cin >> cnt;
m.push(cnt);
}
for(int i=1;i<=c;i++){
cin >> cnt;
d.push(cnt);
}
for(int i=1;i<=e;i++){
cin >> cnt;
k.push(cnt);
}//守门员、后卫、中场和前锋的能力值,分push进自己优先队列
cin >>q;
int x,y,z;
for(int i=1;i<=q;i++){//对综合水平值的计算
int ans=0;//ans放外面的值就不会清零了,所以放在for内
cin >> x >> y >>z;
while(z--){
int cnt=k.top();
k.pop();
ans+=cnt;
}//出队,当前总能力值+上cnt
while(y--){
int cnt=d.top();
d.pop();
ans+=cnt;
}同上
while(x--){
int cnt=m.top();
m.pop();
ans+=cnt;
}同上
ans+=f.top();
f.pop();题目所说不把守门员计算在内,单独处理
printf("%.2lf\n",ans*1.0/11);//关于输出两位数的处理
}
return 0;
}