【优先队列】HDU1873 看病要排队

  • Problem Description
    看病要排队这个是地球人都知道的常识。
    不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么少)同时看病。而看病的人病情有轻重,所以不能根据简单的先来先服务的原则。所以医院对每种病情规定了10种不同的优先级。级别为10的优先权最高,级别为1的优先权最低。医生在看病时,则会在他的队伍里面选择一个优先权最高的人进行诊治。如果遇到两个优先权一样的病人的话,则选择最早来排队的病人。
    现在就请你帮助医院模拟这个看病过程。
  • Input
    输入数据包含多组测试,请处理到文件结束。每组数据第一行有一个正整数N(0 1:“IN A B”,表示有一个拥有优先级B的病人要求医生A诊治。(0 2:“OUT A”,表示医生A进行了一次诊治,诊治完毕后,病人出院。(0
  • 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
    

题意:最多有三个医生,然后有许多具有不同优先级的病人分别找这几个医生看病,模拟其排队过程。优先级高的病人优先诊治,如果具有相同的优先级则先来的人先看病。输入遇到IN就入队,遇到OUT就出队,非空则输出该病人的到来顺序,以其IN的序号为排队顺序。
注意点:priority_queue中存的是node,必须自定义排序规则。priority_queue和sort的默认排序相反,重载的运算符函数operator<必须声明为const函数

#include 
using namespace std;
struct node {
	int prior, time; //优先级; 排队时间 
	node() {}
	node(int p, int t) { prior = p; time = t; }
	bool operator< (const node &a) const { //优先级id越大越早看病; 否则选择早来排队的病人 
		return (prior != a.prior) ? prior < a.prior : time > a.time; 
	}
};
int main() {
	int n, doctId, pri; //医生ID, 病人优先级 
	string s; 
	while (~scanf("%d", &n)) {
		priority_queue<node> d[4]; //最多三位医生1-3
		int inNum = 0; //病人来的顺序 
		for (int i = 1; i <= n; i++) { 
			cin >> s;
			if (s == "IN") {
				cin >> doctId >> pri; //优先级为id的病人要求医生doctId诊治
				d[doctId].push(node(pri, ++inNum));
			} else if (s == "OUT") {
				cin >> doctId; //医生doctId的病人出院 
				if (d[doctId].empty()) cout << "EMPTY\n";
				else {
					cout << d[doctId].top().time << endl; 
					d[doctId].pop(); 
				}
			} 
		}
	}
	return 0;
}

你可能感兴趣的:(HDU)