AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

优先队列学习笔记

作者: 作者的头像   LYH ,  2019-10-06 08:35:34 ,  所有人可见 ,  阅读 1591


10


5

优先队列


优先队列,是,一个跟单调队列一样神奇的数据结构。
手写优先队列不会,只能用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 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息