优先队列


优先队列,是,一个跟单调队列一样的神奇的数据,结构。
手写优先队列不会,只能用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值