【题目描述】
有个朋友在医院工作,想请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
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 100001
#define MOD 123
#define E 1e-6
using namespace std;
struct Node {
int num;
int grade;
char id[N];
} s;
bool operator < (const Node &x, const Node &y)
{
if (x.grade == y.grade)
return x.num < y.num;
return x.grade > y.grade;
}
char str[N], name[N];
priority_queue<Node> q;
int main() {
int n;
scanf("%d\n",&n);
int k = 1;
for (int i = 1; i <= n; i++)
{
scanf("%s",str);
if (strcmp(str, "push") == 0)
{
int a;
scanf("%s%d",name,&a);
s.grade = k;
s.num = a;
for (int j = 0; j < strlen(name); j++)
s.id[j] = name[j];
q.push(s);
}
else
{
if (!q.empty())
{
s = q.top();
q.pop();
printf("%s %d\n", s.id, s.num);
}
else
printf("none\n");
}
}
return 0;
}
信息学奥赛一本通T1371:堆及其应用 看病 归属于 堆及其应用,更多同类题解源程序见:堆及其应用 和 看病
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!