问题B: 看病

博客围绕医院登记系统展开,该系统需按病情严重程度作为优先级安排病人看病。给出了系统的输入输出要求及样例,指出这是一道优先队列模板题,解题思路是将排序方法重载成按看病优先级排序。

题目描述

有个朋友在医院工作,想请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

        }

    }

}

 

HDU1873—看病要排队 时间限制:3000ms,空间限制:32768K。(HDU1509 与之类似) 问题描述:看病要排队这个是地球人都知道的常识。不过经过细心的 0068 的观察,他发现了医院里排队还是有讲究的。0068 所去的医院有三个医生同时看病。而看病的人病情有轻重,所以不能根据简单的先来先服务的原则。所以医院对每种病情规定了 10 种不同的优先级。级别为 10 的优先权最高,级别为 1 的优先权最低。医生在看病时,则会在他的队伍里面选择一个优先权最高的人进行诊治。如果遇到两个优先权一样的病人的话,则选择最早来排队的病人。现在就你帮助医院模拟这个看病过程。 输入格式:输入数据包含多组测试,处理到文件结束。每组数据第一行有一个正整数 n(0<n<2000)表示发生事件的数目。接下来有 n 行分别表示发生的事件。一共有两种事件: (1)IN A B:表示有一个拥有优先级 B 的病人要求医生 A 诊治(0<A≤3,0<B≤10)。 (2)OUT A:表示医生 A 进行了一次诊治,诊治完毕后,病人出院(0<A≤3)。 输出格式:对于每个“OUT A”事件,在一行里面输出被诊治人的编号 ID。如果该事件时无病人需要诊治,则输出"EMPTY"。诊治人的编号 ID 的定义为:在一组测试中,“IN A B”事件发生第 k 次时,进来的病人 ID 即为 k。从 1 开始编号。 输入样例: 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 要求:①提供详细的算法设计思路,思路分为输入、处理和输出三个部分。②生成解题的Java代码。允许存储所有输入,并一次性输出结果,解题代码需包含丰富的中文注释。③解题代码和算法设计思路分开显示,并使用文本格式而非Markdown格式显示。
最新发布
01-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值