• 排队看病(PriorityQueue自定义排序)


    看病要排队这个是地球人都知道的常识。 
    不过经过细心的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的定义为:在一组测试中,"IN A B"事件发生第K次时,进来的病人ID即为K。从1开始编号。 
    Sample Input

    7
    IN 1 1
    IN 1 2
    OUT 1
    OUT 2
    IN 2 1
    OUT 2
    OUT 1
    2
    IN 1 1
    OUT 1

    Sample Output

    2
    EMPTY
    3
    1
    1
    代码:
    import java.util.Comparator;
    import java.util.PriorityQueue;
    import java.util.Scanner;
    class node implements Comparable<node>{
          int prio;
          int index;
          @Override
        public int compareTo(node o) {
              if(this.prio!=o.prio)  return o.prio-this.prio;//优先级从大到小排序
              else return  this.index-o.index;
         }
    }
    public class Main {
           public static void main(String[] args) {
                 Scanner scan=new Scanner(System.in);
                 while(scan.hasNext()){
                       int k=1;
                       PriorityQueue<node> q1=new PriorityQueue<node>();
                         PriorityQueue<node> q2=new PriorityQueue<node>();
                         PriorityQueue<node> q3=new PriorityQueue<node>();
                       int n=scan.nextInt();
                       while(n-->0){
                           String s=scan.next();
                           if(s.equals("IN")){
                                   int a=scan.nextInt();
                                   int b=scan.nextInt();
                                   node t=new node();
                                   t.index=k++;
                                   t.prio=b;
                                   if(a==1)   q1.offer(t);
                                   else if(a==2) q2.offer(t);
                                   else if(a==3) q3.offer(t);
                           }
                           else if(s.equals("OUT")){
                                 int a=scan.nextInt();
                                 if(a==1)
                                       if(q1.isEmpty()) System.out.println("EMPTY");
                                       else  System.out.println(q1.poll().index);
                                 else if(a==2)
                                       if(q2.isEmpty()) System.out.println("EMPTY");
                                       else  System.out.println(q2.poll().index);
                                 else if(a==3)
                                       if(q3.isEmpty()) System.out.println("EMPTY");
                                       else  System.out.println(q3.poll().index);
                           }
                       }
                 }
        }
    }
  • 相关阅读:
    HTML 标签
    HTML与CSS的关系
    用node搭建本地服务环境
    Windows平台下SVN安装配置及使用
    CSS Flex布局整理
    zepto 选中select option 的值
    Zepto tap 穿透bug、解决移动端点击穿透问题
    jquery 上下滚动显示隐藏
    es6学习笔记二:生成器 Generators
    es6学习笔记一:迭代器和for-of循环
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12189157.html
Copyright © 2020-2023  润新知