题目
为什么会想到使用优先队列来处理问题呢?
因为首先涉及到优先级比较的问题,第二又涉及到入队先后的问题,那么采用优先队列无疑是最优解。
算法
主要是优先队列的自定义排序大于和小于是相反的
代码
#include<iostream>
#include<string>
#include<queue>
using namespace std;
struct node
{
int num;//病人的编号,编号越小,来的越早
int priority;//病人的优先级,优先级越高,越早治疗
node(){};
node(int a,int b){
num=a;
priority=b;
}
};
struct cmp
{
bool operator()(node&a,node&b)
{
if(a.priority==b.priority){
return a.num>b.num;
}else{
return a.priority<b.priority;
}
}
};
int main()
{
int T;
while(cin >> T){
priority_queue<node,vector<node>,cmp>q1;
priority_queue<node,vector<node>,cmp>q2;
priority_queue<node,vector<node>,cmp>q3;
int cnt=0;
while(T--){
string s;cin >> s;
if(s=="IN"){
int a,b;cin >> a >> b;
cnt++;
switch(a)
{
case 1:
q1.push(node(cnt,b));
break;
case 2:
q2.push(node(cnt,b));
break;
case 3:
q3.push(node(cnt,b));
break;
}
}else{//读到的是OUT
int a;cin >> a;
switch(a)
{
case 1:
if(q1.empty()){
cout << "EMPTY" << endl;
}else{
node no=q1.top();
cout << no.num << endl;
q1.pop();
}
break;
case 2:
if(q2.empty()){
cout << "EMPTY" << endl;
}else{
node no=q2.top();
cout << no.num << endl;
q2.pop();
}
break;
case 3:
if(q3.empty()){
cout << "EMPTY" << endl;
}else{
node no=q3.top();
cout << no.num << endl;
q3.pop();
}
break;
}
}
}
}
system("pause");
return 0;
}