hdu1873(看病要排队)循环队列害死我了

点击打开杭电1873

Problem 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的定义为:在一组測试中,"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

思路:题意已经非常清楚了,能够用队列做这题。

因为初学队列,不是了解非常深,这题或许也是他们所说的优先队列。

依据题目要求,能够申请三个队列,分别进行操作。而对每一个队列又要考虑优先级,所以在出队列时。能够先对队列中的数据进行一次优先级排序。

仅仅是这里不知道为什么用优先队列就是死都a只是去,用普通队列就一次ac了。真的非常无语!!

!!

!(后面有提供几组有帮助的測试数据)

注:1、要求输出的不是优先级,别看错了哦,而是第几个进来的人的序列号

2、还要对优先级进行排序,别犯错误:找到别当前输出的人的优先级高的,然后进行交换。这是错误的。

普通队列(能ac):

import java.util.Scanner;

public class P1873_2 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s;
		int priority,num,count;
		PersonlQueue[] loopQueue=new PersonlQueue[4];//申请三个队列,这里的0不用
		while(sc.hasNext()){
			int n=sc.nextInt();
			count=0;
			for(int i=1;i<4;i++){
				loopQueue[i]=new PersonlQueue();
			}
			for(int i=0;i<n;i++){
				s=sc.next();
				if(s.charAt(0)==‘I‘){//若是IN则直接入队就可以
					count++;
					num=sc.nextInt();
					priority=sc.nextInt();
					PPersonl p=new PPersonl(count,priority);//这是一个PPersonl类,就是存放每一个人的优先级,还有就是第几个输入的(这也是为什么要单独建一个类的原因)
					loopQueue[num].add(p);//入队
				}else{//出队
					num=sc.nextInt();
					int a=loopQueue[num].pop();
					if(a==0){
						System.out.println("EMPTY");
					}else{
						System.out.println(a);
					}
				}
			}
		}
	}

}
class PPersonl{
	int priority;//优先级
	int count;//人的序列号(第几个人) ,也就是要求要输出的数
	public PPersonl(int count, int priority) {
		this.count=count;
		this.priority=priority;
	}
}
class PersonlQueue{
	int end;
	final int FRONT =0;
	PPersonl[] personl;

	public PersonlQueue(){
		end = 0;
		personl=new PPersonl[10000];
	}

	public void add(PPersonl p){//入队
		personl[end] = p;
		end++;
	}
	public int isEmpty(){//推断是否为空,在此题并没有什么卵用
		if(end<=0){
			return 0;
		}
		return 1;
	}

	public int pop(){//出队
		if(end<=0){
			return 0;
		}
		sort();//对优先级进行排序
		int p = personl[FRONT].count;
		if(end>1){//队首出队,则后面的要补上来
			for(int i=0;i<end;i++){
				personl[i] = personl[i+1];
			}
		}
		end--;
		return p;
	}

	private void sort() {//冒泡排序
		for(int i=0;i<end-1;i++){
			for(int j=0;j<end-i-1;j++){
				if(personl[j].priority<personl[j+1].priority){
					PPersonl temp=personl[j];
					personl[j]=personl[j+1];
					personl[j+1]=temp;
				}
			}
		}

	}
}

循环队列(wa):

package xjj;

import java.util.Scanner;

public class P1873 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s;
		int priority,num,count;
		CirclingQueue[] loopQueue=new CirclingQueue[4];
		while(sc.hasNext()){
			int n=sc.nextInt();
			count=0;
			for(int i=1;i<4;i++){
				loopQueue[i]=new CirclingQueue(n);
			}
			for(int i=0;i<n;i++){
				s=sc.next();
				if(s.charAt(0)==‘I‘){
					count++;
					num=sc.nextInt();
					priority=sc.nextInt();
					Personl p=new Personl(count,priority);
					loopQueue[num].add(p);
				}else{
					num=sc.nextInt();
					int a=loopQueue[num].pop();
					if(a==0){
						System.out.println("EMPTY");
					}else{
						System.out.println(a);
					}
				}
			}
		}
	}

}
class Personl{
	int priority;
	int count;
	public Personl(int count, int priority) {
		this.count=count;
		this.priority=priority;
	}
}
class CirclingQueue{
	int front;
	int end,n;
	Personl[] personl;

	public CirclingQueue(int n){
		front =0;
		end = 0;
		this.n=n;
		personl=new Personl[this.n];
	}

	public void add(Personl p){
		personl[end] = p;
		end = (end+1)%n;
	}
	public int isEmpty(){
		return front==end ?

0 : 1;
	}

	public int pop(){
		if(isEmpty()==0){
			return 0;
		}
		sort();
		int p = personl[front].count;
		front = (front+1)%n;
		return p;
	}

	private void sort() {
		for(int i=front;i<end-1;i++){
			for(int j=front;j<end-i-1;j++){
				if(personl[j].priority<personl[j+1].priority){
					Personl temp=personl[j];
					personl[j]=personl[j+1];
					personl[j+1]=temp;
				}
			}
		}

	}
}

測试数据:

7

IN 1 10

IN 1 5

IN 1 8

IN 1 4

OUT 1

OUT 1

OUT 1

结果:1 3 2

12

IN 1 10

IN 1 4

IN 1 4

IN 1 5

IN 1 4

IN 1 4

OUT 1

OUT 1

OUT 1

OUT 1

OUT 1

OUT 1

结果:1 4 2 3 5 6

时间: 2024-08-04 10:16:41

hdu1873(看病要排队)循环队列害死我了的相关文章

hdu1873看病要排队(优先队列的应用)

题目传送门:hdu1873看病要排队 这道题可以使用优先队列,然后自定义优先级.其余的注意细节然后就没什么问题了. AC代码如下: #include<queue> #include<cstdio> #include<string> #include<cstring> #include<iostream> using namespace std; struct man { int du,num; friend bool operator<(c

hdu1873 看病要排队(结构体优先队列)

看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5769    Accepted Submission(s): 2369 Problem Description 看病要排队这个是地球人都知道的常识. 只是经过细心的0068的观察,他发现了医院里排队还是有讲究的. 0068所去的医院有三个医生(汗,这么少)同一时候看病.而看病

hdu1873看病要排队(优先队列)

看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5488    Accepted Submission(s): 2257 Problem Description 看病要排队这个是地球人都知道的常识. 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病

hdu1873 看病要排队 (优先队列)

Problem Description http://acm.hdu.edu.cn/showproblem.php?pid=1873 看病要排队这个是地球人都知道的常识. 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻重,所以不能根据简单的先来先服务的原则.所以医院对每种病情规定了10种不同的优先级.级别为10的优先权最高,级别为1的优先权最低.医生在看病时,则会在他的队伍里面选择一个优先权最高的人进行诊治.如

hdu1873看病要排队

看病要排队这个是地球人都知道的常识. 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻重,所以不能根据简单的先来先服务的原则.所以医院对每种病情规定了10种不同的优先级.级别为10的优先权最高,级别为1的优先权最低.医生在看病时,则会在他的队伍里面选择一个优先权最高的人进行诊治.如果遇到两个优先权一样的病人的话,则选择最早来排队的病人. 现在就请你帮助医院模拟这个看病过程. Input输入数据包含多组测试,请处理

hdu 1873 看病要排队(优先级队列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题目大意: 三个医生看病,病人排队看病,病人有优先级,优先级高的提前看病,同样的优先级按先后.IN A B : A医生有B病人.OUT  A:A医生看完病人.输入看完病的病人是第几个来的.如果当前的医生没有看病人,输出“EMPYT”. 解题思路: 三个医生队列(优先队列:可以自动排序,解决了优先级问题),定义一个病人结构体,记录病人的顺序 key 和优先级priority,如果当前病人看1号医

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

【转】【2015MIIC】迅雷CTO陈磊:互联网思维会害死很多传统企业

MIIC2015大会的“跨界与重构”论坛上,迅雷CTO.网心科技CEO陈磊的演讲引起众多共鸣——独家揭秘“互联网大忽悠”,给这群人画了像,互联网大忽悠通常有五招: 第1招,画大饼,给你一个宏伟的目标:第2招,批判不够互联网:第3招,堆砌专业名词:第4招,不解决困局反而说这是机遇:第5招,生搬硬套成功案例. 陈磊的结论是,对于传统公司来说,学习互联网思维固然重要,但切记本末倒置. 以下为陈磊演讲全文,经钛媒体编辑: 今天真的不是来打广告的,最近的确有些思考. 华谊的胡总讲“+”是一个神奇的符号,今