#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define N 1000
using namespace std;
struct node
{
int time;
int pat;
friend bool operator < (node a, node b)
{
if(a.pat != b.pat)
return a.pat < b.pat;//定义friend类型的队列,即优先级从降序排列
else
return a.time > b.time;//优先级相等的情况下,按先来后到的顺序排列
}
};
int main ()
{
int n,m,t,k,a;
char s1[N];
char str1[5]={"IN"};//定义IN字符串
while (~scanf("%d",&t))
{
priority_queue<node>q1;
priority_queue<node>q2;
priority_queue<node>q3;//分别定义三个队列,并优化它们
node x1;
node x2;
node x3;//定义三个结构体变量,分别对应三个医生
k=1;//K的值代表了时间
while(t--)//t代表病人数
{
scanf("%s",s1);
if(s1[0]=='I')
{
scanf("%d%d",&n,&m);
if(n==1)
{
x1.time = k;
x1.pat = m;
q1.push(x1);
}
if(n==2)
{
x2.time = k ;
x2.pat = m;
q2.push(x2);
}
else if (n==3)
{
x3.time = k;
x3.pat = m;
q3.push(x3); //三种情况,将病人的到达次序(time),优先级pat,分别进队
}
k++;//循环一次,k递增1
}
else//字符串数组第一个元素不是I,则一定是OUT情况,即有病人出院了
{
scanf("%d",&a);//读入out 后的数字()
if(a == 1)
{
if(q1.empty() )
printf("EMPTY\n");//判断一号医生的队里面是不是空的,是就输出
else
{
x1=q1.top() ;//根据最后进去的最先出来原理...找到“被治疗的”病人
printf("%d\n",x1.time);
q1.pop() ;//将这个出院的病人记录删除
}
}
else if (a==2)
{
if(q2.empty() )
//那么问题来了,为什么把病人out的数据删除呢?
printf("EMPTY\n");//因为不删除的话,下一个出院的病人的数据就无法更新了
else
{
x2=q2.top() ;
printf("%d\n",x2.time );
q2.pop() ;
}
}
else if (a==3)
{
if(q3.empty() )
printf("EMPTY\n");
else
{
x3=q3.top() ;
printf("%d\n",x3.time);
q3.pop() ;
}
}
}
}
}
return 0;
}
解题报告排队
最新推荐文章于 2021-02-12 04:42:52 发布