zoukankan      html  css  js  c++  java
  • 排队看病(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);
                           }
                       }
                 }
        }
    }
  • 相关阅读:
    linux top详解
    软件人才必须具备的素质
    合格程序员每天每周每月每年应该做的事
    正则匹配任意字符(包括换行)
    软件测试方案
    LInux进程间的通信方式有哪儿些?
    三网融合
    php路径问题
    xp 安装SATA AHCI驱动
    进程与线程的区别
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12189157.html
Copyright © 2011-2022 走看看