题目描述

有个朋友在医院工作,想请BSNY帮忙做个登记系统。具体是这样的,最近来医院看病的人越来越多了,因此很多人要排队,只有当空闲时放一批病人看病。但医院的排队不同其他排队,因为多数情况下,需要病情严重的人优先看病,所以希望BSNY设计系统时,以病情的严重情况作为优先级,判断接下来谁可以去看病。

输入

第一行输入n,表示有n个操作。

对于每个操作,首先输入push或pop。

push的情况,之后会输入ai 和 bi,分别表示患者姓名和患者病情优先级。

pop后面没有输入,但需要你输出。

输出

对于pop的操作,输出此时还在排队人中,优先级最大的患者姓名和优先级。

表示他可以进去看病了。

如果此时没人在排队,那么输出”none”,具体可见样例。

样例输入

7

pop

push bob 3

push tom 5

push ella 1

pop

push zkw 4

pop

样例输出

none

tom 5

zkw 4

提示


【数据规模和约定】


 


1≤n≤100000,每个人的优先级都不一样,0≤优先级≤2000000000。


 


姓名都是小写字母组成的,长度小于20。

思路:

这是一道优先队列模板题,只需要将排序方法重载成按看病优先级排序即可

代码:

#include<bits/stdc++.h>

using namespace std;

struct per{

    int num,f;

    char id[22];

}s;

bool operator < (const per&x,const per&y)//重载排序方法

{

       if(x.f==y.f)

       return x.num <y.num;//按优先级从大到小排序

       else

       return x.f>y.f;

}

int main()

{

    int n,a,b;

    scanf("%d\n",&n);

    char str[10],name[21];

    priority_queue<per>q;

    int k=1;

    for(int j=1;j<=n;j++)

    {

        scanf("%s",str);

        if(strcmp(str,"push")==0)

        {

               scanf("%s%d",name,&a);

               s.f=k;//计入排队顺序

            s.num=a;//计入优先级

            for(int i=0;i<strlen(name);i++)

                     s.id[i]=name[i];//输入保存名字

            q.push(s);//保存结构体入队列

        }

        else

        {

            if(!q.empty()) //当队列不为空时

            {

                   s=q.top();

                q.pop();

                printf("%s %d\n",s.id,s.num);//输出最上面的数据

            }

            else

            printf("none\n");//当队列为空时输出none

        }

    }

}