优先队列

Java容器概述

故事扮演 提交于 2019-12-03 01:27:44
Java容器(Container) 什么是容器? 容器可以管理对象的生命周期、对象与对象之间的依赖关系。 直白点说容器就是一段Java程序,能够帮助你管理对象间的关系,而不需要你自行编写程序处理。 维基百科定义: 在计算机科学中,容器是指实例为其他类的对象的集合的类、数据结构、[1][2]或者抽象数据类型。换言之,它们以一种遵循特定访问规则的系统的方法来存储对象。容器的大小取决于其包含的对象(或元素)的数目。 潜在的不同容器类型的实现可能在空间和时间复杂度上有所差别,这使得在给定应用场景中选择合适的某种实现具有灵活性。 Java内部的容器类 Java内部的容器类主要分为两类:Collection(集合)与Map(图) Collection Set HashSet 基于哈希表实现,底层使用HashMap来保存所有元素。 不能保证迭代顺序 允许使用null元素 LinkedHashSet LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承于HashSet。 内部使用双向链表维护插入顺序。 TreeSet 基于(TreeMap)红黑树实现 TreeSet非同步,线程不安全 TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。 List ArrayList 实现 List 接口

HDU 1242 Rescue(BFS+优先队列)

匿名 (未验证) 提交于 2019-12-03 00:41:02
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel‘s friends want to save Angel. Their task is: approach Angel. We assume that "approach Angel" is to get to the position where Angel stays. When there‘s a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up, down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we

P2672 推销员 优先队列 + 贪心

匿名 (未验证) 提交于 2019-12-03 00:41:02
~~~题面~~~ 题解: 我会说我想这道普及组题都想了好久么。。。。 不熟练的普及组选手.jpg 最后随便猜了一个结论居然是对的。。。 放结论: 假设x = i的最优决策为f[i], 那么f[i + 1]一定包括f[i]. 也就是说f[i+1]一定可以由f[i]推出来。 所以f[i]一定是由f[i+1]中选定的所有点中去掉一个得来的。 即下一次选择一定是基于上一次选择的。。。 至于证明嘛。。。感性理解吧。 因为选哪户人家推销其实相互没太多联系。而且选i个推销肯定选满是最划得来的。。。。 大概是这么理解的吧。(反向理解可能更加好理解一点) 所以有了这个结论就很好解决了。 因为f[n]的最优决策肯定是n个点全选。 所以我们从这个已知的往前推。 于是我们来观察这n个点,到底删掉哪个减掉的疲劳值最小呢? 首先选中的这些点可以看做一个有序点集,位置由s[i]的大小所决定。 因此我们记last[x]为在x前面的第一个点的id, Next[x]为在x后面的第一个点的id。 于是有两种情况: 1,删去的点在末尾。   此时减掉的疲劳值为a[x] + 2 * (s[x] - s[last[x]]) 2,删去的点在中间。   那么此时对走路的距离没有任何影响,因此我们只需要减a[x]即可。 值得注意的是,当末尾点k为a[i]最小的点时, 我们需要再取出次小的点来做比较,因为a[k]虽然最小

C++中优先队列的使用

匿名 (未验证) 提交于 2019-12-03 00:40:02
既然是队列那么先要包含头文件 #include <queue> 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的 。 定义: priority_queue<Type, Container, Functional> Type Container Functional // 升序队列 priority_queue < int ,vector< int >,greater< int > > q; // 降序队列 priority_queue < int ,vector< int >,less< int > > q; // greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了) 1.基本类型例子: #include<iostream> #include <queue> using namespace std; int main() { // 对于基础类型 默认是大顶堆 priority_queue< int > a; // 等同于 priority_queue<int, vector<int>, less<int> > a; // 这里一定要有空格,不然成了右移运算符↓ priority_queue< int ,

合并果子 算法之优先队列

匿名 (未验证) 提交于 2019-12-03 00:21:02
合并果子 描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。 格式 输入格式 输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。 输出格式 输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。 样例1 样例输入1 3 1 2 9 样例输出1 15 #include<bits/stdc++.h> #define maxN

数据结构――优先队列

匿名 (未验证) 提交于 2019-12-03 00:17:01
2019-11-06 10:43:47 参考《数据结构与算法分析 C++描述》 优先队列的应用: 操作系统的进程调度:MLFQ(多级反馈队列) 模型: 优先队列至少满足两种操作:1.插入 (insert) 2. deleteMin(删除最小顶) 如同大多数数据结构一样,有时可能要添加一些其他的操作,但这些添加的操作属于扩展的操作,而不是基本模型的一部分。 实现方法: 1.链表 2.二叉查找树 来源:博客园 作者: JasonPeng1 链接:https://www.cnblogs.com/JasonPeng1/p/11803893.html

优先队列实现最小堆

匿名 (未验证) 提交于 2019-12-02 23:57:01
最小堆可是在遍历后,保存最大的k个值 最大堆可是在遍历后,保存最小的k个值 优先队列 默认为最大堆,即输出为最大值 优先队列实现最小堆 #include <iostream> #include <algorithm> #include <vector> using namespace std ; //为自定义类 做比较函数 struct cmp { bool operator ()( node a , node b ){ return a . key > b . key ; } }; int main (){ priority_queue < node , vector <node> , cmp > q ; //非自定义类 直接用greater<> priority_queue < int , vector <int> , greater <int> > q ; return 0 ; } 来源:51CTO 作者: mwb1995 链接:https://blog.csdn.net/mwb1995/article/details/89059778

C++STL――优先队列

匿名 (未验证) 提交于 2019-12-02 23:52:01
一、相关定义 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。 优先级队列可以用向量(vector)或双向队列(deque)来实现(注意list container不能用来实现queue,因为list的迭代器不是任意存取iterator,而pop中用到堆排序时是要求randomaccess iterator 的!): priority_queue<deque<int>, greater<int> > pq2;   // 使用递减greater<int>函数对象排序 其成员函数有“判空(empty)” 、“尺寸(Size)” 、“栈顶元素(top)” 、“压栈(push)” 、“弹栈(pop)”等。 二、priority_queue 基本操作: pop()    删除对顶元素,删除第一个元素 top()     返回优先队列对顶元素,返回优先队列中有最高优先级的元素 在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。 头文件: 声明方式: 1、普通方法: 2、自定义优先级:     }   };

STL 优先队列 用法

匿名 (未验证) 提交于 2019-12-02 23:52:01
今天做题用到了优先队列 对它的用法还不是很熟悉 现在整理一下。 需要的库 #include<queue> using namespace std; 定义 priority_queue<Type, Container, Functional> Type是数据的类型 比如int啊char啊之类的 Container是容器类型默认是vector 具体用法 基本用法1 priority_queue <int> q; 这是最基本的用法 不需要像定义一样传三个参数进去 只需要声明一个数据类型即可 需要注意的是 优先队列是默认从大到小排的! 基本用法2 //升序队列 priority_queue <int,vector<int>,greater<int> > q; //降序队列 priority_queue <int,vector<int>,less<int> >q; 因为声明了比较的方式,这次必须要传三个参数进去了 需要注意的是: greater是升序排列,也就是从小到大排,不是我们想当然的greater就是从大到小!(所以这里只需要记住 greater是升序 up up~ less是降序down down~ 这样比较符合正常人的认知,也好记~) 进阶用法1(运算符重载) 方法1 使用 friend bool operator typedef struct node { int num;

Rescue BFS+优先队列 杭电1242

匿名 (未验证) 提交于 2019-12-02 23:51:01
˼· : 优先队列 每次都取最小的时间,遇到了终点直接就输出# include <iostream> #include <queue> #include <cstring> using namespace std ; const int N = 200 ; int n , m , sa , ea , sr , er ; char arr [ N ][ N ]; int bb [ N ][ N ]={ 0 }; struct stu { int a , b ; int time ; bool friend operator <( const stu & a , const stu & b ){ return a . time > b . time ; } }; int a [ 4 ]={ 0 , 1 , 0 ,- 1 }; int br [ 4 ]={ 1 , 0 ,- 1 , 0 }; void bfs (){ priority_queue <stu> que ; stu s ; s . a = sa ; s . b = ea ; s . time = 0 ; que . push ( s ); bb [ sa ][ ea ]= 1 ; int flag = 0 ; while ( que . size ()){ stu p ; p = que . top (); que .