优先队列

hdu1873 看病要排队 优先队列

梦想与她 提交于 2020-04-04 08:41:54
看病要排队 Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Status Description 看病要排队这个是地球人都知道的常识。 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么少)同时看病。而看病的人病情有轻重,所以不能根据简单的先来先服务的原则。所以医院对每种病情规定了10种不同的优先级。级别为10的优先权最高,级别为1的优先权最低。医生在看病时,则会在他的队伍里面选择一个优先权最高的人进行诊治。如果遇到两个优先权一样的病人的话,则选择最早来排队的病人。 现在就请你帮助医院模拟这个看病过程。 Input 输入数据包含多组测试,请处理到文件结束。 每组数据第一行有一个正整数N(0<N<2000)表示发生事件的数目。 接下来有N行分别表示发生的事件。 一共有两种事件: 1:"IN A B",表示有一个拥有优先级B的病人要求医生A诊治。(0<A<=3,0<B<=10) 2:"OUT A",表示医生A进行了一次诊治,诊治完毕后,病人出院。(0<A<=3) Output 对于每个"OUT A"事件,请在一行里面输出被诊治人的编号ID。如果该事件时无病人需要诊治,则输出"EMPTY"。 诊治人的编号ID的定义为:在一组测试中

(贪心 优先队列)P1090合并果子 洛谷

眉间皱痕 提交于 2020-03-30 06:32:20
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n-1 n − 1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 1 1,并且已知果子的种类 数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 例如有 3 3 种果子,数目依次为 1 1 , 2 2 , 9 9 。可以先将 1 1 、 2 2 堆合并,新堆数目为 3 3 ,耗费体力为 3 3 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12 1 2 ,耗费体力为 12 1 2 。所以多多总共耗费体力 =3+12=15 = 3 + 1 2 = 1 5 。可以证明 15 1 5 为最小的体力耗费值。 输入输出格式 输入格式: 共两行。 第一行是一个整数 n(1\leq n\leq 10000) n ( 1 ≤ n ≤ 1 0 0 0 0 ) ,表示果子的种类数。 第二行包含 n n 个整数,用空格分隔,第 i i 个整数 a_i(1\leq a_i\leq

PriorityQueue底层原理

房东的猫 提交于 2020-03-21 07:59:20
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。 总体介绍 前面以Java ArrayDeque 为例讲解了 Stack 和 Queue ,其实还有一种特殊的队列叫做 PriorityQueue ,即优先队列。 优先队列的作用是能保证每次取出的元素都是队列中权值最小的 (Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系, 元素大小的评判可以通过元素本身的自然顺序( natural ordering ),也可以通过构造时传入的比较器 ( Comparator ,类似于C++的仿函数)。 Java中 PriorityQueue 实现了 Queue 接口,不允许放入 null 元素;其通过堆实现,具体说是通过完全二叉树( complete binary tree )实现的 小顶堆 (任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为 PriorityQueue 的底层实现。 上图中我们给每个元素按照层序遍历的方式进行了编号,如果你足够细心,会发现父节点和子节点的编号是有联系的

STL优先队列详解

…衆ロ難τιáo~ 提交于 2020-03-21 02:49:18
优先队列 优先队列是一种抽象数据类型(Abstract Date Type,ADT),行为和队列类似,但是先出队的元素不是先进队列的元素,而是队列中优先级最高的元素。 STL的优先队列定义在头文件<queue>和 (队列一样),用"priority_queue<int>pq"来声明; 最基本的用法 定义 : priority_queue<int>pq ; 操作: pq.empty() 如果队列为空返回真 pq.pop() 删除对顶元素 pq.push() 加入一个元素 pq.size() 返回优先队列中拥有的元素个数 pq.top() 返回优先队列对顶元素 下面我们介绍几种优先队列的定义方式: priority_queue<int>pq 默认的是整数越大,优先级越高,如果想让他 整数越小 优先级越高怎么办? STL中也有模板 “priority_queue<int,vector<int>,greater<int > >pq” 上面的尖括号内第一个 参数 为入队元素类型(int),第二个为容器类型(vector<int>),第三个为比较函数(greater<int>) 因此我们也能自定义 priority_queue<int,vector<int>,cmp1 >pq; 最小值优先 priority_queue<int,vector<int>,cmp2 >pq2; 最大值优先

STL之优先队列

大兔子大兔子 提交于 2020-03-21 02:48:50
STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素个数 top() 返回优先队列对顶元素 在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。 使用方法: 头文件: #include <queue> 声明方式: 1、普通方法: priority_queue < int > q; // 通过操作,按照元素从大到小的顺序出队 2、自定义优先级: struct cmp { operator bool ()( int x, int y) { return  x > y; // x小的优先级高 // 也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高 } }; priority_queue < int , vector < int > , cmp > q; // 定义方法 // 其中,第二个参数为容器类型。第三个参数为比较函数。 3、结构体声明方式: struct node { int x, y; friend bool operator < (node a, node b) { return a.x > b.x; // 结构体中,x小的优先级高 } }; priority

优先队列

柔情痞子 提交于 2020-03-21 02:48:11
转自:http://www.cnblogs.com/summerRQ/ 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部。priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级。这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面。标准库默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载 < 操作符。 优先队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。 1) 优先队列的定义 包含头文件:"queue.h", "functional.h" 可以使用具有默认优先级的已有数据结构;也可以再定义优先队列的时候传入自定义的优先级比较对象;或者使用自定义对象(数据结构),但是必须重载好< 操作符。 2) 优先队列的常用操作 优先级队列支持的操作 q.empty() 如果队列为空,则返回true,否则返回false q.size() 返回队列中元素的个数 q.pop() 删除队首元素,但不返回其值 q.top() 返回具有最高优先级的元素值,但不删除该元素 q.push(item) 在基于优先级的适当位置插入新元素 其中q.top()为查找操作,在最小优先队列中搜索优先权最小的元素

java优先队列 PriorityQueue

為{幸葍}努か 提交于 2020-03-21 02:46:10
PriorityQueue是个基于优先级堆的极大优先级队列。 此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable), 也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。 依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException) 比如队列 1 3 5 10 2 自动会被排列 1 2 3 5 10 package com.javaer.examples.datastruct; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import org.apache.poi.ss.formula.functions.Count; public class PriorityQueueExample { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Queue qi = new PriorityQueue(); qi.add(5); qi.add(2); qi.add(1);

Java优先队列

故事扮演 提交于 2020-03-21 02:45:37
按照Java api的说法: java.util. PriorityQueue .PriorityQueue() Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering . 优先队列PriorityQueue的默认排序方式为其中元素的自然顺序。下面利用这一特点,把它当成个小顶堆来求出数组中的前k大元素 package structure; import java.util.Iterator; import java.util.PriorityQueue; import java.util.Queue; /** * Java中的优先队列使用 * @author Dreamy * */ public class PriorityQueueDemo { /** * @param args */ public static void main(String[] args) { //Java中的PriorityQueue 默认排序方式为自然顺序 int[] numbers = {4,5,2,1,9,6,8,7}; findTopK(numbers); } //找出数组中top k大 private

复数集合(优先队列 priority_queue,相关top push pop操作)(重载小于号运算符)

混江龙づ霸主 提交于 2020-03-17 10:46:28
题目描述 一个复数(x+iy)集合,两种操作作用在该集合上: 1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出 empty ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE; 2 Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE; 最开始要读入一个int n,表示接下来的n行每一行都是一条命令。 输入描述: 输入有多组数据。 每组输入一个n(1<=n<=1000),然后再输入n条指令。 输出描述: 根据指令输出结果。 模相等的输出b较小的复数。 a和b都是非负数。 示例1 输入 复制 3 Pop Insert 1+i2 Pop 输出 复制 empty SIZE = 1 1+i2 SIZE = 0 #include <iostream> #include <queue> using namespace std; typedef struct Complex { int real; int imag; // 重载小于号 // operate 不对, 是 operator!! bool operator < (Complex a)const { if (real * real + imag * imag == a.real * a.real + a.imag * a.imag) {

C++优先队列 priority_queue

情到浓时终转凉″ 提交于 2020-03-16 23:43:13
简介 优先队列(priority_queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。 它与队列最大的区别是:自动排序!!! 头文件 #include <queue> 常见基本声明格式: priority_queue < int > t ; //默认是从大到小排列,即最大优先 priority_queue < int , vector < int > , less < int > > p ; //不需要再写#include <vector>头文件,因为他默认的容器就是vector priority_queue < double , vector < double > , greater < double > > q ; //注意后面两个'>' 不要写在一起,">>" 是右移运算符 常见基本操作:以p为例 p . size ( ) ; //返回q里面元素个数 p . empty ( ) ; //判断q是否为空,返回1就是空 p . push ( num ) ; //在队列末尾插入num p . pop ( ) ; // 删除q的第一个元素 p . top ( ) ; // 返回q的第一个元素 示例 # include <iostream> # include <queue> using namespace std ;