首页 > 编程语言 >简单算法:优先队列

简单算法:优先队列

时间:2023-01-07 13:44:26浏览次数:52  
标签:priority 优先 队列 queue 算法 升序 排序

典型题目

题目传送门

优先队列

对于蒟蒻来说,堆之类的……实在是有点不好理解。
所以我们今天只从表面上讲讲什么是优先队列,并且争取做到熟练的运用(知其然不知其所以然)
就好了。

什么是优先队列?

我们可以简单粗暴的理解为优先队列和普通队列差不多,但是多了一个自动的排序,而这个排序规则,你自己定。
我们最常用到的升序和降序排序,如下:

//升序队列
priority_queue<数据类型,vector<数据类型>,greater<数据类型> >Greatq;
//降序队列
priority_queue<数据类型,vector<数据类型>,less<数据类型> >Lessq;

前期的话对于蒟蒻来说,这两个已经够了,不过后期如果有更复杂的排序规则,可以自己将运算符重载……

易错点

  1. 注意这句话:
priority_queue<数据类型,vector<数据类型>,greater<数据类型> >Greatq;
                                                        ^ //注意这里,两个 > 不能连一块,不然会被当成位运算,不管是升序还是降序。
  1. 自动排序的意思是指:每次往队列里扔一个东西,都会自动按规则排序一次。

基本操作

优先队列的基本操作……和普通队列差不多,但是有一些出现了差别:

priority_queue<int,vector<int>,greater<int> >q;
int a;
cin>>a;
q.push(a);//这个都能理解吧,往队列里扔一个数
cin>>a;
q.push(a);//这个此时,由于有了两个元素,队列自动按我们设定好的升序排序
a=q.top();//注意这个top虽说是返回队头元素,但是可能已经不是原先那个队头!可能是排序后的队头元素!
q.pop();//pop,挤出来的也不一定是最先进队的元素,而是排序后的第一个元素。
cout<<a;
a=q.top();//同上
q.pop();
cout<<q.size();//返回队q元素个数
cout<<q.empty();//返回q是否为空,空则返回1,否则返回0

回头看题

题目传送门
这题简直就是优先队列的板子题。
实际上就是让我们创建一个升序队列,每次从里面pop两个,累加到ans上,然后把这两个的和在扔进队里。
常数不大,稳过。
代码:

#include<bits/stdc++.h>
using namespace std;
int n,t,a1,a2,ans;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&t);
		q.push(t);	
	}
	for(int i=1;i<n;i++){
		a1=q.top();
		q.pop();
		a2=q.top();
		q.pop();
		ans+=a1+a2;
		q.push(a1+a2);
	}
	printf("%d",ans);
	return 0;
} 

完结撒花

标签:priority,优先,队列,queue,算法,升序,排序
From: https://www.cnblogs.com/mornhus-xsylf-123/p/17032532.html

相关文章

  • 深度优先与广度优先算法
    一、算法核心深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方。1)深度优先搜索深度优先搜索属于图算法的一种,是一个针对图和树......
  • 代码随想录算法训练营第10天
    今日刷题2道:先简单复习了栈和队列的理论基础,然后做题:232.用栈实现队列,225.用队列实现栈。ps:昨天不想学习,所以今天补回来,出来混总是要还的啊。● 232.用栈实现队列......
  • Allure08-动态用例优先级与链接
    动态用例优先级allure.dynamic.severity(用例优先级)可以使用参数化的参数只能放到函数和方法中对于一个子功能或测试需求的每一条用例,都可以有自己的severity写法allure.......
  • Allure04-用例优先级与链接
    用例优先级@allure.severity(用例优先级)表示测试用例的重要级别或错误的严重程度BLOCKER:中断缺陷,如客服端程序无响应,无法执行下一步骤CRITICAL:严重缺陷,如功能点缺失NORMA......
  • 【数据结构与算法】Collection接口&迭代器
    Java合集框架数据结构是以某种形式将数据组织在一起的合集(collection)。数据结构不仅存储数据,还支持访问和处理数据的操作在面向对象的思想里,一种数据结构也被认为是一个容器......
  • 基础算法
    构造排序双指针与扫描线二分倍增分治贪心莫队随机化近似算法......
  • 《随机算法在信息学竞赛中的应用》做题记录
    目录《随机算法在信息学竞赛中的应用》做题记录MSTONESProblemSolutionP3567[POI2014]KUR-CouriersProblemSolutionCF364DGhdProblemSolutionTKCONVEXProblemSolutionP12......
  • 代码随想录算法训练营第10天 | 232. 用栈实现队列 225. 用队列实现栈
    232.用栈实现队列文章:代码随想录(programmercarl.com)思路:使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈......
  • 算法刷题 Day 10 | 232.用栈实现队列 225. 用队列实现栈
    今日任务:理论基础用栈实现队列用队列实现栈理论基础了解一下栈与队列的内部实现机智,文中是以C++为例讲解的。文章讲解:https://programmercarl.com/%E6%A0%......
  • 代码随想录day10 LeetCode 232. 用栈实现队列 225. 用队列实现栈
     232.用栈实现队列https://leetcode.cn/problems/implement-queue-using-stacks/利用两个栈来实现队列,一个先存储进去的,一个存储IN栈倒出来的元素,这样就可以获取到队首......