题目链接:
看病要排队
题目描述:
7 IN 1 1 IN 1 2 OUT 1 OUT 2 IN 2 1 OUT 2 OUT 1 2 IN 1 1 OUT 1
2 EMPTY 3 1 1
这道题咋一看有点像是队列的题目,因为题目中描述的过程像是队列的模拟,但是题目的要求是,每次OUT的时候输出的是当前最
需要“看病的病人”,而且如果当前最需要看病的病人不止一个,那么就输出先来的那位病人。有了这样分析,那么很明显这是一道优
先队列的题目。
但是需要注意的是,这不是普通的优先队列,决定优先级的元素不止一个,而是由优先权和ID两个值决定,因此我们要重新定义一
下优先队列的优先级,然后重载<运算符,这样的话优先队列内部元素就可以实现优先级之间的比较了。完整代码实现:
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
class line
{
public:
int value;
int ID;
friend bool operator < (const line &a,const line &b)
{
if(a.value!=b.value) return a.value < b.value;
else return a.ID > b.ID;
}
};
void solve(){
int t;
while(scanf("%d",&t)!=EOF){
char act[5];
int x,y,k = 1;
line tmp;
priority_queue <line> q[4];
while(t--){
scanf("%s",act);
if(!strcmp(act,"IN")){
scanf("%d %d",&x,&y);
tmp.value = y;
tmp.ID = k;
q[x].push(tmp);
++k;
}
else{
scanf("%d",&x);
if(q[x].empty()){
printf("EMPTY\n");
}
else{
printf("%d\n",q[x].top().ID);
q[x].pop();
}
}
}
}
}
int main(){
solve();
return 0;
}