快速入手优先队列

2023-05-16

一.理解优先队列

标准模板库(Standard Template Library,STL)

C++功能强大,为开发者提供了标准模板库,其中封装了很多实用的容器。容器可以理解成能够实现很多功能的系统函数,或者说用来存放数据的对象,开发者可以根据接口规范(调用格式)直接调用,而不用关心其内部实现的原理和具体代码,十分方便快捷。

常见的容器有vector、stack、queue、map、set等。

优先队列(priority_queue)

STL 的容器中还有两种容器与队列有关,分别是双端队列(deque)和优先队列(priority_queue)。

priority_queue翻译为优先队列,一般用来解决一些贪心问题,其底层是用“堆”来实现的。

在优先队列中,任何时刻,队首元素一定是当前队列中优先级最高(优先值最大)的那一个(大根堆),也可以是最小的那一个(小根堆)。

可以不断往优先队列中添加某个优先级的元素,也可以不断弹出优先级最高的那个元素,每次操作其会自动调整结构,始终保证队首元素的优先级最高。

二.优先队列定义

定义和使用priority_queue前,也只要添加queue头文件(#include<queue>)。定义一个priority_queue的方法为:

priority_queue<typename> name;

其中,typename可以是任何基本类型或者容器,name为优先队列的名字。通过top()或pop()访问队首元素(也称堆顶元素),也就是优先级最高的元素。对于可以直接使用的基本数据类型(int等),优先队列对它们的优先级设置一般是数字越大的优先级越高(对于char,则是字典序最大的)。

三.prtority_queue的常用函数

(1)push()

push(x)是将x加入优先队列,时间复杂度为O(logn),n为当前优先队列中的元素个数。加入后会自动调整priority_queue的内部结构,以保证队首元素(堆顶元素)的优先级最高。

(2)top()

top)是获得队首元素(堆顶元素),时间复杂度为O(1)。

(3)pop()

popO是让队首元素(堆顶元素)出队,时间复杂度为O(logn),n为当前优先队列中的元素个数。出队后会自动调整priority_queue的内部结构,以保证队首元素(堆顶元素)的优先级最高。

四.定义排列方式

默认优先队列中的元素按照从大到小的顺序排列;若想从小到大排列有三种方法

  1. 输出元素乘以-1

  1. 利用C++funtional函数

  1. 与sort()函数类似,自己定义函数指针/函数对象/函数类模版对象

priority_queue <int> q1; //定义heap为一个int类型的优先队

priority_queue <double> q2; //定义k为一个double类型的优先队列

这两种定义方式都是大根堆,想要使其变成小根堆,可以将每个数据都乘以-1,输出再乘回-1

priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,所以中间要加上空格

priority_queue<int,vector<int>,less<int> >que4;最大值优先

五.greater<int>与less<int>

很多人greater和less会混淆,其实虽然greater有更大的意思,但构建的是小顶堆,可我们换个角度想,这个小顶堆弹出去的都是小的,留下来的就是更大的了!

这有个例题方便理解

题目

问题描述:给定n个正整数,删除最大的n1个数和最小的n2个数,并计算其余正整数的平均值。
·输入:输入由多组测试用例组成。每组测试用例由两行组成。
第一行包含三个整数n1,n2和n(1<=n1,n2<=10,n1+n2<n<=5000000)由一个空格隔开。第二行包含n个正整数(对于所有的ai,1<=i<=n,1<=ai<=10^8)由一个空格隔开。最后输出测试用例为三个0。
输出:对于每组测试用例,输出删除相关元素后的平均值,并将其四舍五入到小数点后6位。

分析

·本题的数据规模很大,如果通过排序获取相关区间的元素,计算累加和,肯定会因为时间效率太低而超时。
可以采用这样的方法:引入一个大根堆和一个小根堆,输入给定的数,使大根堆保存最大的n1个数,小根堆保存最小的n2个数,再算出所有的数的总和sum。随后,将sum减去大根堆里的元素和小根堆里的元素,再计算平均数。

代码

int main(){
    int n1, n2, n, x;
    while (scanf("%d %d %d", &n1, &n2, &n) && n > 0){
        priority_queue<int, vector<int>, greater<int> >qsmall;//小根堆,保存最大的n1个数
        priority_queue<int, vector<int>, less<int> >qbig;//大根堆,保存最小的n2个数
        double sum = 0.0;
        for (int i = 0; i < n; i++){ //遍历所有的元素
            scanf("%d", &x);
            sum += x;
            qsmall.push(x);
            qbig.push(x);
            if (qsmall.size() > n2)qsmall.pop();//保存最大的n1个数
            if (qbig.size()>n2)qbig.pop();//保存最小的n2个数
        }
    }
//n1+n2<n,后面直接让总数sum减去qsmall中保存的最大的n1个数和qbig中保存的最大的n2个数即可
}

~感谢观看❥(^_-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速入手优先队列 的相关文章

随机推荐

  • 靶机渗透练习94-hacksudo:2 (HackDudo)

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo 2 hackdudo 667 Description N A This works better with VirtualBox ra
  • 靶机渗透练习95-hacksudo:3

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo 3 671 Description This box should be easy This machine was created
  • 靶机渗透练习96-hacksudo:Thor

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo thor 733 Description Box created by vishal Waghmare This box should
  • 靶机渗透练习97-hacksudo:ProximaCentauri

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo proximacentauri 709 Description Box created by hacksudo team member
  • 靶机渗透练习98-hacksudo:L.P.E.

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo lpe 698 Description Box created by hacksudo team members mahesh paw
  • 靶机渗透练习99-hacksudo:FOG

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo fog 697 Description This box should be easy This machine was create
  • 通过Python调用OpenMV识别小球获取坐标

    OPenMV介绍 OpenMV是基于Python的嵌入式机器视觉模块 xff0c 目标是成为机器视觉界的 Arduino 它成本低易拓展 xff0c 开发环境友好 xff0c 除了用于图像处理外 xff0c 还可以用Python调用其硬件资
  • 基于HAL库的STM32串口中断接收16进制数据

    最近 xff0c 要弄Lora组网 xff0c 采集温湿度通过网关和ESP8266数据上传服务器 xff0c Lora的库采用hal编写 xff0c 因此要改用Hal库编写程序 ESP8266的串口中断是基于标准库编写的 xff0c 因此
  • 模仿标准库函数,利用UART_IT_RXNE和UART_IT_IDLE两个标志,写了一个hal库串口接收的程序,只用到在中断写

    突然间发现 xff0c 原来的标准库的程序 xff0c 改成hal库 xff0c 把hal库里的一些规则 形式掌握好 xff0c 只需要做一些小的改动即可 这里是串口2的接收中断的代码 xff0c 用串口1实现这个功能 xff0c 修改一下
  • RTK+GPS提高定位精度原理解析(一个小白写给另一个小白系列)

    目录 GPS定位原理回顾 RTK基本概念 RTK组成 RTK传输差分示意 RTK数据链接 坐标转换 RTK应用 后记 我们在上一篇文章导航定位系统的原理解析 xff08 一个小白写给另一个小白 xff09 中跟大家介绍了GPS定位的基本原理
  • 项目管理风险把控:三点估算法

    施工时间划分为乐观时间 最可能时间 悲观时间 乐观时间 也就是工作顺利情况下的时间为a 最可能时间 最可能时间 xff0c 就是完成某道工序的最可能完成时间m 悲观时间 最悲观的时间就是工作进行不利所用时间b 活动历时均值 或估计值 61
  • Git中 fork, clone,branch之前的区别你真的都了解了吗

    一 是什么 fork fork xff0c 英语翻译过来就是叉子 xff0c 动词形式则是分叉 xff0c 如下图 xff0c 从左到右 xff0c 一条直线变成多条直线 转到git仓库中 xff0c fork则可以代表分叉 克隆 出一个
  • 进入计算机专业学习的一些体会和思考以及今后的学习规划

    一 前言 这篇文章 xff0c 我分享了刚刚进入计算机专业学习的一些体会和思考以及今后的学习规划 xff0c 今后计划在CSDN进行学习上的反馈 xff0c 欢迎大家一起交流 xff0c 有大佬看到多多指教 x1f64f 二 体会与思考 在
  • ▲什么是类?类有什么作用?

    目录 一 什么是类 xff1f 二 类与对象是什么关系 xff1f 三 类和结构体有什么区别呢 xff1f 四 如何创建一个类 五 如何创建一个类的对象 1 对象的创建 2 创建对象的初始化 1 默认构造函数 2 普通构造函数 3 复制构造
  • 【STL】vector容器如何使用?

    文章目录 前言vector的理解vector的成员类型vector的创建vector的迭代器vector的容量vector元素访问vector的元素修改 前言 上篇博客简述了string类 xff0c 实际上就是一个用来装字符的容器 xff
  • 2022/4/9-蓝桥杯C++B组题解-G题-积木画

    宽为1 1种 xff1e a 1 61 1 宽为2 2种 xff1e a 2 61 2 宽为3 先排最左边2列 种数a 2 避免重复情况下 xff0c 排最右边1列 钟数1 这个情况种数a 2 1 61 2 先排最左边1列 种数a 1 避免
  • 动态规划算法

    一 前言 动态规划是一种常用的算法 xff0c 在算法领域十分重要 xff0c 但对于新手来说 xff0c 理解起来有一定的挑战性 xff0c 这篇博客将明确步骤来一步一步讲解动态规划到底该如何理解与运用 二 解析动态规划算法 1 特点 把
  • 常见背包问题

    一 前言 若你想学习或正在学习动态规划 xff0c 背包问题一定是你需要了解的一种题型 xff0c 并且大多数人最初都是从背包问题入坑进而打开动态规划这一大门 背包问题分为多种 xff0c 你可以先掌握最常见的主要是三类 xff1a 01背
  • 如何配置ublox ZED-F9P 高精度模块+Ntrip DTU 网络电台(连接千寻/CORS/自建站)实现网络RTK定位

    格林恩德F9P RTK模块 xff0c 集成高精度板卡 ZED F9P 可同时接收GPS 北斗 xff0c GALILEO GLONASS 卫星系统的L1 L2频点 xff0c 结合高精度天线一体化设计 xff0c 体积小 xff0c 重量
  • 快速入手优先队列

    一 理解优先队列 标准模板库 xff08 Standard Template Library STL C 43 43 功能强大 xff0c 为开发者提供了标准模板库 xff0c 其中封装了很多实用的容器 容器可以理解成能够实现很多功能的系统