快速入手优先队列
创始人
2025-05-31 17:00:34
0

一.理解优先队列

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

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

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

优先队列(priority_queue)

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

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

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

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

二.优先队列定义

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

priority_queue 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 q1; //定义heap为一个int类型的优先队

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

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

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

priority_queue,less >que4;最大值优先

五.greater与less

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

这有个例题方便理解

题目

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

分析

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

代码

int main(){int n1, n2, n, x;while (scanf("%d %d %d", &n1, &n2, &n) && n > 0){priority_queue, greater >qsmall;//小根堆,保存最大的n1个数priority_queue, less >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

~感谢观看❥(^_-)

相关内容

热门资讯

恩施旅游攻略5日游景点有哪些,... 出发前刷攻略刷到头秃,看到人均预算500元就能玩转恩施的帖子时,我直接笑出声——这年头旅游哪有这么便...
中山热门景点两日游攻略 中山旅游景点攻略:两天一日游,带你玩转中山! 嘿,计划来中山游玩的小伙伴们!是不是已经迫不及待想要开...
常熟人吃鱼的108种姿势:从科... 一条鲤鱼游出的千年文化密码 当苏州少年金耀星在天津全国烹饪大赛上,用迷你版果汁松鼠桂鱼斩获特金奖时,...
旅游还有哪些不开心的事 旅游中的“闹心”事儿,你遇到过几件? 旅游,本是一场逃离日常琐碎,奔赴诗和远方的美好旅程。然而,现...
陕西金延安端午文旅盛宴点燃文化... 又是一年端阳到,龙舟竞渡粽香飘。节日期间,陕西省延安市金延安旅游度假区将红色演艺与主题教育相结合,精...
去四川旅游攻略旅游团五日游要花... 标题:【我的四川五日游亲测报告:跟着本地导游乐乐玩转四川,花费竟如此实惠!】 四川旅游推荐!当地导游...
全球农创客训练营走进云南以“咖... 央广网北京6月2日消息(记者韩雪莹)据中央广播电视总台中国之声《新闻纵横》报道,一杯咖啡,可以让人头...
15道 旺销特色菜,创意融合 藜蒿炒腊肉 原料: 腊肉(肥三瘦七)300克,鄱阳湖藜蒿300克,韭菜段150克,盐、红辣椒段、蒜...
家里有个会做饭的男人太幸福了,... 姐妹们!你们知道家里有个会做饭的老公是什么体验吗?那就是——每天下班回家都能吃到热腾腾的饭菜,关键还...
原创 5... 姐妹们,今天给你们分享个我家每周必吃的省钱神菜—— 酸辣土豆丝!成本不到5块钱,10分钟出锅,每次炒...
原创 半... 朋友们,今天教你们一个偷懒都能被夸厨神的神仙做法! 只要电饭锅会煮饭,你就能做出甜到粘嘴唇的照烧五花...
原创 R... 曾经风头无两的韩国超级偶像Rain与他的妻子金泰熙已经携手走过七个年头,虽然外界对他们婚后生活的报道...
“龙腾端午·梧现精彩”非遗好市... 6月1日,由梧州市文化广电体育和旅游局主办的“龙腾端午·梧现精彩”非遗好市在梧州市西堤公园持续开展。...
上海海派旗袍文化节开幕,推出3... 静态展览,动态走秀,互动体验……6月1日,“旗韵绽芳华”——6·6上海海派旗袍文化节在张园拉开帷幕。...
华程国旅推出“欧洲循环巴士游” 英国当地时间5月27日下午,华程国旅集团TRIP2EU“欧洲循环巴士游”发布会伦敦站在伦敦千禧酒店举...
原创 6... “来来来,尝尝我们厂的窑鸡,特意给你加的菜!”何家劲笑容满面,将一整盘热腾腾的窑鸡推到黄日华面前。 ...
原创 以... #优质好文激励计划# “以前人人爱吃的小龙虾,为啥现在不火了?内行:4个原因很难改变” 家人们,谁...
吉木萨尔县第三届厦吉文化美食汇... 5月31日,为期3天的“百味醉天山 闽疆共飨宴”昌吉州旅游文化美食节系列活动之吉木萨尔县第三届厦吉文...
去四川旅游攻略当地团五天四晚要... 标题:去四川旅游攻略当地团五天四晚要花多少钱,驴友亲测!跟着乐乐玩转四川 四川旅游推荐!当地导游-乐...
上海迪士尼游客打架,属地部门:... 上海市公安局浦东分局官方微博6月1日消息,5月31日18时许,浦东公安分局接报警称迪士尼乐园内有人打...