优先队列


优先队列,是,一个跟单调队列一样的神奇的数据,结构。
手写优先队列不会,只能用STL库自带的priority_queue。

声明priority_queue的头文件

#include或#include

定义

priority_queue,less> a; //less递增函数
priority_queue,greater >q;//depue双端队列,greater递减函数
priority_queuea;
priority_queuea;
---------------------------------------------------
struct node{
~~~~~
}
priority_queuea;
--------------------------------------------------

priority_queue的操作

实际上就是那些:

priority_queueq;
q.empty()——队列是否为空,空为true,否则为false
q.pop()——删除队顶元素
q.push()——压入一个元素
q.size()——返回优先队列中的元素个数
q.top()——返回q的第一个元素

priority_queue的排序方式

priority_queue q;//优先队列自带排序,元素从大到小的顺序排序出队
priority_queue, greater > q;//greater,按照元素从小到大的顺序排序出队
struct cmp{
	int x,y;
	bool operator< (const node & a)const{
		return x,less > a;//less排序从大到小
priority_queue,greater >a; //greater排序从小到大
//less和greater后的两个>之间要打" ",不然错哪里都不知道~~(绝对没有体验过)~~

所以,优先队列实际上就是一个自带从大到小排序的队列,最大元素会排在队首,然后,跟队列一样先进先出~~(感觉比单调队列半路插队要好写一些?)~~
那就做一道例题吧~~(绝对没有滑动窗口的普及+/提高)~~
P3887 [GDOI2014]世界杯
读题可知,这道题有四个综合水平值,说明了什么?
当然是开四个优先队列啦~~(逃~~

#include
using namespace std;

priority_queue, less > k,d,m,f;//根据题目开的四个优先队列,也可以打四次priority_queue, less >,不然考试背不到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;
}

你可能感兴趣的:(优先队列)