hdu1509(Windows Message Queue) 优先队列
Problem Description
Meanwhile, the process will do a loop for getting message from the queue according to the priority value if it is not empty. Note that the less priority value means the higher priority. In this problem, you are asked to simulate the message queue for putting
messages to and getting message from the message queue.
Input
and priority followed by. There will be at most 60000 command. Note that one message can appear twice or more and if two messages have the same priority, the one comes first will be processed first.(i.e., FIFO for the same priority.) Process to the end-of-file.
Output
Sample Input
GET
PUT msg1 10 5
PUT msg2 10 4
GET
GET
GET
Sample Output
EMPTY QUEUE!
msg2 10
msg1 10
EMPTY QUEUE!
题意:
依据操作指令进行操作,也就是出队,还是入队。而在出队时。要注意。保证优先级低的先出来,要是优先级一样的话。就先入队的先出来。从题目就非常easy看出要用优先队列做,恰好java包中有个PriorityQueue类,就是现成的优先队列。
解题过程:首先依据题意,能够建一个Message类,这里面包含mesg的一些信息,主要包含,优先级和进队的序列号(这个序列号必需要,也就是第几个进队的,后面就知道了)。然后依据指令一步一步的操作,就能够得到答案。
注意:
1、PriorityQueue类与普通队列最基本的差别就是多了个比較器。普通情况下,都是自己通过实现Comparator接口写一个比較器,在new 优先队列时将这个比較器丢进去就ok了,
构造方法中就有 PriorityQueue(int initialCapacity,
Comparator<?
super E> comparator)
使用指定的初始容量创建一个 PriorityQueue,并依据指定的比較器对元素进行排序。
2、尽管优先队列在放入元素时,会通过当中的比較器进行比較后,放到对应的位置。可是至于它内部是怎么比較的,怎么放的。我还没去深究,可是在这里我知道。尽管题目是说先通过优先级进行存放,然后通过进队顺序存放,听起来仅仅要考虑
优先级排序即可了。主观上就会以为仅仅要优先级同样时,也就是compare返回0。它就会放在同一优先级。但先进来的元素后面。事实上不然,并非这种,这里必需要通过进队的序列号来比較后才干达到想要的目的。
代码实现:
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner; public class P1509 { public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
PriorityQueue<Message> priorityQue=new PriorityQueue<Message>(6000,new MesCmp());//优先队列
Message messg;//messg类
int count=0;
while(sc.hasNext()){
String operate=sc.next();
if(operate.charAt(0)=='G'){//出队
if(priorityQue.isEmpty()){
System.out.println("EMPTY QUEUE!");
}else{
System.out.println(priorityQue.poll());
}
}else{//入队
messg=new Message(sc.next(), sc.nextInt(), sc.nextInt(),count++);
priorityQue.add(messg);
}
}
} } class Message{
String name;
int value;
int priority;
int id;
public Message(String name, int value, int priority,int id) {
this.name = name;
this.value = value;
this.priority = priority;
this.id = id;
}
public String toString() {
return name + " " + value;
}
}
class MesCmp implements Comparator<Message>{ public int compare(Message m1, Message m2) {
if(m1.priority<m2.priority){
return -1;
}else if(m1.priority>m2.priority){
return 1;
}else{
//这里假设没有id的比較,那顺序就会出错
if(m1.id<m2.id){
return -1;
}else if(m1.id>m2.id){
return 1;
}else{
return 0;
}
}
}
}
hdu1509(Windows Message Queue) 优先队列的更多相关文章
- hdu 1509 Windows Message Queue (优先队列)
Windows Message QueueTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- zoj 2724 Windows Message Queue 优先队列
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1724 题目大意: 给出两种操作,GET要求取出当前队首的元素,而PUT会输入名 ...
- Windows Message Queue(优先队列)
欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) Windows Message Queue Time Limit: 2000/1000 MS (Java/Others) Mem ...
- hdoj 1509 Windows Message Queue【优先队列】
Windows Message Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- hdu 1509 Windows Message Queue
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1509 Windows Message Queue Description Message queue ...
- Windows Message Queue
Windows Message Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- zoj 2724 Windows Message Queue
Windows Message Queue Time Limit: 2 Seconds Memory Limit: 65536 KB Message queue is the basic f ...
- D - Windows Message Queue
来源hdu1509 Message queue is the basic fundamental of windows system. For each process, the system mai ...
- HDU 1509 Windows Message Queue(队列)
题目链接 Problem Description Message queue is the basic fundamental of windows system. For each process, ...
随机推荐
- 关于因各种原因,造成LINUX主机不能通过域名访问自己的解决办法
因路由黑洞或其它原因造成自己域名或外网IP的解决办法: vi /etc/hosts 添加一行: 10.28.86.250 www.edusoa.com 保存退出.
- ionic3 学习记录
1生命周期 ionViewDidLoad(){ console.log("1.0 ionViewDidLoad 当页面加载的时候触发,仅在页面创建的时候触发一次,如果被缓存了,那么下次再打开 ...
- 对DDD中领域服务的理解
CZ 能不能清晰具体区分service和实体的区别 网上有人用DCI来解决 不知道对不对 STST 我复习下DDD中的服务的概念了参与讨论啊CZ 这个我也看过 但是太过于笼统 STST STST 复习 ...
- 有向图强连通分量的Tarjan算法及模板
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强联通(strongly connected),如果有向图G的每两个顶点都强联通,称有向图G是一个强联通图.非强联通图有向 ...
- python 面向对象(成员,静态,类)的(变量,方法)区别
静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者 ...
- Maven学习笔记2
Maven安装配置 1.下载Maven 官方地址:http://maven.apache.org/download.cgi 将下载的压缩包解压到你要安装 Maven 的文件夹.假设你解压缩到文件夹 – ...
- [UOJ206]Gap
子任务$1$:直接找到最大值后从两边开始找,一步一步从左右到中间确定所有数,调用次数是$\left\lceil\dfrac n2\right\rceil$ 子任务$2$:先找到最大值$mx$和最小值$ ...
- jdk8新特性
JDK8新特性(JDK8的新特性) * 接口中可以定义有方法体的方法,如果是非静态,必须用default修饰 * 如果是静态的就不用了 class Test { public void run() { ...
- 网络编程-UDP
代码部分--UDP传输 * 1.发送Send * 创建DatagramSocket, 随机端口号 * 创建DatagramPacket, 指定数据, 长度, 地址, 端口 * 使用DatagramSo ...
- Activity组件(传递数据)
(一) 1.效果图:点击按钮“调用第二个Activity”,转到第二页面,之后点击“返回数据”,将第二个页面的数据传到第一个页面 2. activity_main.xml <?x ...