优先队列

合并果子(STL优先队列)

拥有回忆 提交于 2019-12-01 16:55:55
STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,greater<int>>q;队列从小到大排序 从大到小:方法1:重载运算符 struct Node{ int x,y; Node(int a=0, int b=0): x(a), y(b) {} }; struct cmp{ bool operator()(Node a, Node b){ if(a.x == b.x) return a.y>b.y; return a.x>b.x; } }; priority_queue<Node,vector<Node>,cmp>q; 方法二:用less,priority_queue<int,vector<int>,less<int>>q;队列从大到小排序 题目来源: https://www.luogu.org/problem/P1090 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n-1 n − 1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

自己封装的优先队列,堆实现

僤鯓⒐⒋嵵緔 提交于 2019-12-01 16:31:06
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #define MAX_H nodes1 #define MIN_H nodes2 #define LL long long using namespace std; struct nodes1 { LL k; bool operator <(const nodes1 &b) const { return k < b.k; } }; struct nodes2 { LL k; bool operator <(const nodes2 &b) const { return k > b.k; } }; template <class TYPE> class Que { public: Que() { len = 0; } int len; TYPE num[30005]; void adjust_d(TYPE num[], int cur, int n) { int i = cur,j = i*2+1; //printf("ij: %d %d\n", i, j); //printf("%d\n",n); while(j < n) { if(j+1 < n) j = num[j]<num[j+1]?j+1:j; if(num[i]<num

C++STL小结

折月煮酒 提交于 2019-12-01 02:14:53
(未完待续。。。) 更新队列:二分(lower_bound&upper_bound)完善,vector,deque,set,bitset以及一些神奇函数 本文同步更新于我的 luogu blog 前言: STL是个好东西,可以帮助我们较快 懒 的构建程序。 虽然这玩意儿常数大 但在时间复杂度正确的情况下,一般不会有人 xian de dan teng 去卡STL的。 在本蒟蒻会的前提下整理的,可能不全 目录: sort 队列&优先队列 二分(lower_bound&upper_bound) 正文 sort 这玩意儿应该挺好理解,大佬们把它优化的很好了,一般排序就用它就ok 输入: 10 5465 12 54 6 21 54 315 1 0 1 #include<cstdio> #include<algorithm>//sort所在头文件 using namespace std;//sort const int N=10005; int n,a[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1); /* a:排序数组名称 1:起始下标 n:数组长度 */ for(int i=1;i<=n;i++) { printf("%d ",a[i]); }

对于一些stl自定义比较函数

自作多情 提交于 2019-11-30 23:44:09
1.unorderd_map自定义键 自定义类型 struct my_key { int num; string name; }; 1、由于unordered_map是采用哈希实现的,对于系统的类型int, string等,都已经定义好了hash函数,所以如果我们引入新的自定义类型的话,系统并不知道如何去计算我们引入的自定义类型的hash值,所以我们就需要自己定义hash函数,告诉系统用这种方式去计算我们引入的自定义类型的hash值 自定义的hash函数如下: struct myHashFuc { std::size_t operator()(const my_key &key) const { return std::hash<int>()(key.num); } }; 由于我们的结构中有int和string,所以此处直接采用系统的int的哈希做法即可 2、重载==号 除了自定义哈希函数外 系统计算了hash值后,还需要判断是否冲突,对于默认的类型,系统都知道怎样去判断是否相等,但不知道怎样去判断我们引入的自定义类型是否相等,所以需要我们重载==号,告诉系统用这种方式去判断2个键是否相等 struct my_key { int num; string name; my_key(){} ~my_key(){} my_key(int a, string b) : num(a),

用优先队列式分支限界法解决0-1背包问题

我是研究僧i 提交于 2019-11-30 16:38:29
用优先队列式分支限界法解决0-1背包问题的算法思想: 1.分支限界法常以广度优先或最小耗费优先(最大效益优先)方式搜索问题的解空间树, 对于0-1背包问题的解空间树是一个颗子集树。 2.在分支限界法中有一个活结点表,活结点表中的每个活结点只有一次机会成为扩展结点,一旦成为 扩展结点就一次性产生所有儿子结点,在这些儿子结点中,导致不可行解或导致非最优解的儿子 结点被舍弃,其余儿子结点被加入到活结点表中。对于0-1背包问题中的每个活结点只有两个儿子 结点,分别表示对物品i的选取和对物品i的舍去;在判断儿子结点是否能加入到活结点表中,有两个 函数需要满足,第一个称为约束函数,判断能否满足背包容量约束,第二个称为限界函数,判断 是否可能有最优解。 3.为了尽快找到0-1背包问题的解,每次选取下一个活结点成为扩展结点的判断依据是当前情况下 最有可能找到最优解的下一个结点。因此,每次选择扩展结点的方法:当前情况下,在活结点表中 选择活结点的上界uprofit(通过限界函数Bound求出)最大的活结点成为当前的扩展结点。 这一过程一直持续到找到所需的解或活结点表为空时为止。这个过程体现出分支限界法以“最大 效益优先”方式进行。 4.为了在活结点表中选择拥有最大的上界uprofit的活结点,在活结点表上实现优先队列。 5.通过上述第3点,可以求出0-1背包问题的最优值。为了求出0

9.27

…衆ロ難τιáo~ 提交于 2019-11-30 15:12:30
今天我再写了一次大根堆,一些问题我就记在heap4了,heap2是自己写的并且能ac的。 记得明天再写一遍,确实还有不少问题。 1,关于大根堆的问题。 一,algorithm头文件用在哪里 二,define RI LE DAD 这几个东西的深入理解。 、 三,struct 中 modify 和repair 的完整理解 四,int main函数中的 涉及到 top 和pop操作的这块。 2,在用优先队列试了一下 一,首先要有<queue>的头文件 二,再就是声明这个队列就行,priority_queue<int> h; 三,剩下的main就是那样没有变化。 来源: https://www.cnblogs.com/beiyueya/p/11600890.html

【优先队列】Function

本秂侑毒 提交于 2019-11-30 06:33:19
Function 题目描述 wls有n个二次函数Fi(x)=aix2+bix+ci(1≤i≤n)。 现在他想在 且x为正整数的条件下求 的最小值。 请求出这个最小值。 输入 第一行两个正整数n,m。 下面n行,每行三个整数a,b,c分别代表二次函数的二次项,一次项,常数项系数。 1≤n≤m≤100,000 1≤a≤1,000 −1,000≤b,c≤1,000 输出 一行一个整数表示答案。 样例输入 2 3 1 1 1 2 2 2 样例输出 13 【队友的思路】   每次先把m当成每一份,然后先给n个,剩余的m-n就给当前增长多的那个即可. 【队友的代码】 1 #pragma GCC optimize(2) 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 6 struct node{ 7 ll a, b, c; 8 ll x, val, pri; 9 10 bool operator < ( const node & rhs )const { 11 return pri > rhs.pri ; 12 } 13 }; 14 priority_queue<node> Q; 15 int main() 16 { 17 int n, m; 18 scanf("%d%d",&n,&m); 19

﹥>﹥吖頭↗ 提交于 2019-11-30 06:23:46
目录 一、什么是优先队列 二、什么是堆 三、堆的抽象数据类型描述 四、最大堆的操作 4.1 最大堆的创建 4.2 最大堆的插入 4.3 最大堆的删除 4.4 最大堆的建立 五、Python实现堆 5.1 上浮 shift up 5.2 下沉 shift_down 5.3 插入 push 5.4 弹出 pop 更新、更全的《数据结构与算法》的更新网站,更有python、go、人工智能教学等着你: https://www.cnblogs.com/nickchen121/p/11407287.html 一、什么是优先队列 优先队列(Priority Queue): 特殊的 队列 ,取出元素的顺序是依照元素的 优先权(关键字) 大小,而不是元素进入队列的先后顺序。 问题是: 如何组织优先队列?我们可以通过以下三种方法: 一般的数组、链表 有序的数组或者链表 二叉搜索树?AVL树? 若采用数组或链表实现优先队列,我们可以看看它们在队列操作时的时间复杂度: 数组: 插入:元素总是插入尾部—— \(\Theta(1)\) 删除:查找最大(或最小)关键字—— \(\Theta(n)\) 从数组中删除时需要移动元素—— \(O(n)\) 链表: 插入:元素总是插入链表的头部—— \(\Theta(1)\) 删除:查找最大(或最小)关键字—— \(\Theta(n)\) 删除结点—— \(\Theta

C - Justice(优先队列+并查集)

杀马特。学长 韩版系。学妹 提交于 2019-11-30 06:07:45
Put simply, the Justice card represents justice, fairness, truth and the law. You are being called to account for your actions and will be judged accordingly. If you have acted in a way that is in alignment with your Higher Self and for the greater good of others, you have nothing to worry about. However, if you have acted in a way that is out of alignment, you will be called out and required to own up to your actions. If this has you shaking in your boots, know that the Justice card isn’t as black and white as you may think. On the table there are n weights. On the body of the i-th weight

【简单的spfa+优先队列】

拟墨画扇 提交于 2019-11-29 18:52:04
题目是给出只有x和y构成的图,相同元素走路不花费,不同元素间花费1,给出起点终点,最少花费是 #include<cstdio> #include<algorithm> #include<math.h> #include<queue> #include<string.h> using namespace std; const int maxn=110; int nxt[4][2]={ {0,1},{0,-1},{-1,0},{1,0} }; int vis[maxn][maxn]; char a[maxn][maxn]; int n,m; int tx,ty,endx,endy; struct node { int x,y,step; }; bool operator<(node a,node b) { return a.step>b.step; } priority_queue<node>q; int bfs() { while(!q.empty()) q.pop(); memset(vis,0,sizeof(vis)); node temp; temp.x=tx,temp.y=ty,temp.step=0; q.push(temp); vis[tx][ty]=1; while(!q.empty()){ node t=q.top(); q.pop(); for(int i=0;i<