hdu 1873 看病要排队

题目连接

http://acm.hdu.edu.cn/showproblem.php?pid=1873

看病要排队

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

优先队列的运用。。

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<vector>
 7 #include<queue>
 8 #include<map>
 9 #include<set>
10 using std::cin;
11 using std::cout;
12 using std::endl;
13 using std::find;
14 using std::sort;
15 using std::set;
16 using std::map;
17 using std::pair;
18 using std::vector;
19 using std::multiset;
20 using std::multimap;
21 using std::priority_queue;
22 #define pb(e) push_back(e)
23 #define sz(c) (int)(c).size()
24 #define mp(a, b) make_pair(a, b)
25 #define all(c) (c).begin(), (c).end()
26 #define iter(c) decltype((c).begin())
27 #define cls(arr,val) memset(arr,val,sizeof(arr))
28 #define cpresent(c, e) (find(all(c), (e)) != (c).end())
29 #define rep(i, n) for (int i = 0; i < (int)(n); i++)
30 #define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
31 const int Max_N = 100010;
32 typedef unsigned long long ull;
33 struct Node {
34     int id, f;
35     Node(int i = 0, int j = 0) :id(i), f(j) {}
36     friend bool operator<(const Node &a, const Node &b) {
37         return a.f == b.f ? a.id > b.id : a.f < b.f;
38     }
39 };
40 priority_queue<Node> que[3];
41 int main() {
42 #ifdef LOCAL
43     freopen("in.txt", "r", stdin);
44     freopen("out.txt", "w+", stdout);
45 #endif
46     char buf[10];
47     int n, a, b, k;
48     while (~scanf("%d", &n)) {
49         k = 1;
50         rep(i, n) {
51             scanf("%s", buf);
52             if (buf[0] == 'I') {
53                 scanf("%d %d", &a, &b);
54                 que[a - 1].push(Node(k++, b));
55             } else {
56                 scanf("%d", &a);
57                 if (que[a - 1].empty()) { puts("EMPTY"); continue; }
58                 printf("%d
", que[a - 1].top().id); que[a - 1].pop();
59             }
60         }
61         rep(i, 3) {
62             while (!que[i].empty()) que[i].pop();
63         }
64     }
65     return 0;
66 }
View Code
By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
原文地址:https://www.cnblogs.com/GadyPu/p/4604345.html