优先队列

POJ 1442 优先队列

谁都会走 提交于 2020-02-07 02:09:14
题意:有一些ADD和GET操作。n次ADD操作,每次往序列中加入一个数,由ADD操作可知序列长度为1-n时序列的组成。GET操作输入一个序列长度,输出当前长度序列第i大的元素的值。i初始为0,每次GET操作i先加1。给出的GET操作输入非降。 思路:求长度为k的序列的第i大元素。优先队列维护最大堆和最小堆分别存放前i-1大的元素和第i-第k大的元素。将当前序列的元素压入最小堆,如果最小堆的最小数大于最大堆的最大数则进行交换,保证最大堆中的所有数小于最小堆。因为i值每进行一次自增1,所以每次GET操作后将最小堆中的最小数弹出存入最大堆。 #include<cstdio> #include<queue> using namespace std; priority_queue<int> bigque; priority_queue<int, vector<int> ,greater<int> > smallque; int num[30010]; int main() { int n,m,x; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&num[i]); int k=1; for(int i=1;i<=m;i++) { scanf("%d",&x); while(k<=x) { smallque.push(num[k]);

优先队列专题

对着背影说爱祢 提交于 2020-02-07 02:06:29
1、UVALive 3135 Argus   题意:有若干注册信息,每个id每经过一个周期返回一个id信息。求前k个返回信息的id。如果两个信息返回的时间点相同,则小的那个先返回。   思路:优先队列简单应用。 1 #include<iostream> 2 #include<queue> 3 #include<map> 4 #include<cstdio> 5 using namespace std; 6 char s[10]; 7 struct nd 8 { 9 int id; 10 int v; 11 nd(int ii=0,int vv=0):id(ii),v(vv){ } 12 friend bool operator<(const nd&a, const nd&b) 13 { 14 if (a.v == b.v) return a.id > b.id; 15 else return a.v > b.v; 16 } 17 }; 18 int main() 19 { 20 priority_queue<nd>q; 21 map<int, int>mp; 22 while (~scanf("%s", s)) 23 { 24 if (s[0] == '#')break; 25 int id, period; 26 scanf("%d%d", &id, &period); 27 q

例题5-7 UVA136 Ugly Numbers(20行AC代码)

∥☆過路亽.° 提交于 2020-02-07 02:01:18
紫书刷题进行中,题解系列【 GitHub | CSDN 】 例题5-7 UVA136 Ugly Numbers(20行AC代码) 思路分析 直接暴力求解会超时,因此可采用优先队列构造法 从1开始,对于x,2x,3x,5x均为丑数 因此,初始将1推入优先队列,每次从优先队列取出最小值,然后2x,3x,5x推入优先队列 有些数可能会重复构造,因此用set去重 注意点 可能会溢出,用long long类型 优先队列定义优先级 AC代码(C++11,优先队列,set去重,丑数构造) # include <bits/stdc++.h> using namespace std ; typedef long long LL ; int main ( ) { LL a [ 3 ] = { 2 , 3 , 5 } , t , num = 0 ; priority_queue < LL , vector < LL > , greater < LL > > pq ; // 优先队列 set < LL > _set ; // 判重 pq . push ( 1L ) ; _set . insert ( 1L ) ; // 第一轮 while ( true ) { t = pq . top ( ) ; pq . pop ( ) ; num ++ ; if ( num == 1500 ) break ; for

优先队列

一曲冷凌霜 提交于 2020-02-03 18:41:04
头文件:#include<queue>、#include<functional> 定义:(默认:从大到小)priority_queue<int> que;    (自定义:从大到小)priority_queue<int,vector<int>,less<int> > que;    (最后两个'>'间要有个空格,下同)    (自定义:从小到大)prioity_queue<int,vector<int>,greater<int> > que; 操作:增加新元素——que.push(a[i]);   :删值队首元素——que.pop();   :访问队首元素——que.top();   :查询元素个数:que.size();   :判断队列空否:que.empty();(空为真) 来源: https://www.cnblogs.com/Cnxz/p/12256605.html

单调队列、单调栈、优先队列模板

偶尔善良 提交于 2020-02-03 00:02:24
目录 单调栈、单调队列及优先队列 1.单调队列 2.单调栈 3.优先队列 单调栈、单调队列及优先队列 1.单调队列 单调队列的描述:指队列中元素之间关系具有单调性,而且队首和队尾都可以出队,但是只有队尾可以进行入队操作。 其重要作用是找到前n个后者后n个数的最值。 其具体操作是:假设单调队列是单调递减队列,假设在插入元素v时,将队列尾部的元素同v比较,如果队列尾部的元素不大于元素v,我们直接删除队尾元素,再将队尾元素与v比较,直至队尾元素比v大,这个时候我们将v插入队尾。其实现代码如下: int que[100]; int head = 0, tail = 0; void push(int a) //进队 { que[++tail] = a; } int pop() //出队 { return que[++head]; } bool empty() //判断队列是否为空 { return !(head < tail); } 下面是求一个整数序列中每k个中的最大值和最小值的代码: #include<iostream> #include<cstdio> using namespace std; const int maxn=1e6+10; int arr[maxn],que[maxn]; int main() { int n,k; scanf("%d%d",&n,&k); for

优先队列

可紊 提交于 2020-02-01 08:50:44
声明容器 //1.priority_queue可以使用已有的数值类型 priority_queue < int , vector < int > , greater < int > > q; //升序排列(小的先出队) priority_queue < int , vector < int > , less < int > > q ; // 降序排列 /*注:第一个参数是priority_queue的数值类型。第二个参数是用来存放数值 的容器类型,一般用vector即可。第三个参数为排序规则,只有这两种,可以不 写,默认降序排列。 **还有第三个参数>后必须有一个空格*/ * * //2.priority_queue也可也使用自己创建的容器类型,不过写出排序规则 struct node { int l , r ; node ( ) { } ; node ( int l , int r ) : l ( l ) , r ( r ) { } //排序规则,< 是降序less bool operator < ( const node & a ) const { return l < a . l ; } //排序规则,> 是升序greater bool operator > ( const node & a ) const { return l > a . l ; } } ; /

STL之priority_queue使用简介

点点圈 提交于 2020-01-30 00:56:15
优先队列容器也是一种从一端入队,另一端出对的队列。不同于一般队列的是,队列中最大的元素总是位于队首位置,因此,元素的出对并非按照先进先出的要求,将最先入队的元素出对,而是将当前队列中的最大元素出对。 C++ STL 优先队列的泛化,底层默认采用 vector 向量容器,使得队列容器的元素可做数组操作,从而应用堆算法找出当前队列最大元素,并将它调整到队首位置,确保最大元素出队。 堆算法(heap algorithm) 具有 nLog(n) 阶的算法时间复杂度,优先队列也可看作容器适配器,将底层的序列容器 vector 转换为优先队列 priority_queue. priority_queue 优先队列容器的 C++ 标准头文件也是 queue ,需要用宏语句 "#include <queue>" 包含进来。 同样是因为仅需取队首和队尾元素的操作,因此 priority_queue 优先队列容器也不提供迭代器,对其他任意位置处的元素进行直接访问操作。使用时,一般用 priority_queue<T> 的形式进行具现, T 是优先队列元素的一个具现类型。 创建 priority_queue 对象 使用 priority_queue 队列之前,要先利用构造函数生成一个优先对象,才可进行元素的入队、出对、取队首及队尾等操作。 1. priority_queue() 默认的构造函数

优先队列-UVA10603

本小妞迷上赌 提交于 2020-01-26 18:10:30
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 typedef struct state STA; 6 struct state 7 { 8 int cup[3],water; 9 bool operator< (const state p)const 10 {//优先队列的核心其实在于队列内元素的排列顺序,也就是自定义变量的 < 定义 11 return this->water > p.water; 12 } 13 }; 14 15 priority_queue<STA> psd; 16 const int maxn = 300; 17 int vis[maxn][maxn];//采取二维数组的原因之一是:所有状态的可能总数很少 18 int ans[maxn]; 19 int maxcup[3],aimd; 20 21 int update_ans(STA& p) 22 { 23 for(int i=0;i<3;i++) 24 { 25 int t=p.cup[i]; 26 if(ans[t]==-1||ans[t]>p.water)ans[t]=p.water; 27 } 28 return 0; 29 } 30 31 int bfs() 32 { 33

算法-10-优先队列

久未见 提交于 2020-01-26 17:29:00
目录 1、背景 2、优先队列 3、二叉堆 4、插入函数-insert() 5、删除最大元素- delMax() 6、完整代码 7、三叉树 1、背景 考虑以下问题:输入 N 个int值,从中找出最大的(或是最小的)M 个int值。这中情景可以出现在:比如每个月的账单有很多记录,我只需要消费最大的5笔记录。那么我们的实现方法是什么呢? 方法一:将这N个int值排序,然后依次输出最大的M个。(如果数据量庞大,你得每次等到排序完之后才能拿到你想要的值,无法立即得到) 方法二:每次有新的消费记录插入的时候,都和那M(5)笔最大的记录进行比较。(除非M很小,否则代价很大) 方法三:优先队列(插入的时候就最大元素已经放在了合适的位置,等待获取) 2、优先队列 优先队列是一种抽象数据类型,和栈和队列类似,只是职能不一样。 它的主要职能是:1、删除(获取)最大的元素; 2、插入元素 插入和删除元素实现方式有三种: 第一种是插入的时候就排序好,这样取的时候直接拿就好了。(有序数组) 第二种是插入的时候不管,取的时候遍历拿到最大的元素。(无序数组) 第三种就是二叉 堆。 下面是这三种的时间复杂度。 3、二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种: 最大堆 和 最小堆 。最大堆: 父结点 的键值总是大于或等于任何一个子 节点 的键值;最小堆

poj 2051 UVA 1203 LA 3135 Argus 题解

↘锁芯ラ 提交于 2020-01-26 03:57:05
博客观赏效果更佳 题意简述 有一些进程,每个进程有两个属性:id和per。id表示进程编号,per表示每per的时刻就会被调用一遍。如果有多个进程在同一时刻被调用,先调用进程编号小的。求先调用的k个进程。 思路框架 优先队列。定义小于号,每次取最小的,然后把它下一次被调用的时间放回优先队列。 具体思路 优先队列中,如果a<b,则b比a优先。我们的优先是时刻第一优先,id第二优先。我们保存当前进程被调用的时刻,per值,和id值。比较a<b的时候,由于小的优先,所以我们要先判断a的时间>b的时间,然后判断a的id>b的id。 对于一个进程(id,Time,per),它的下一次调用显然珂以被表示为(id,Time+per,per)。我们每次从优先队列中取最优先的(id,Time,per),将它弹出队列,然后把(id,Time+per,per)入队列,即珂 代码 # include <cstdio> # include <cstring> # include <cstdarg> # include <algorithm> # include <queue> using namespace std ; namespace Flandre_Scarlet { # define N 155555 # define F(i,l,r) for(int i=l;i<=r;++i) # define