1371:看病

1371:看病
时间限制: 1000 ms         内存限制: 65536 KB
【题目描述】
有个朋友在医院工作,想请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 <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
	char nm[25];
	int v;
}hp[100005];
int sz;
void shift_up(int i){
	while(i>1&&hp[i/2].v<hp[i].v){
		swap(hp[i/2],hp[i]);
		i=i/2;
	}
}
void push(node x){
	hp[++sz]=x;
	shift_up(sz);
}
node top(){
	return hp[1];
}
void shift_down(int i){
	int j;
	while(i*2<=sz){
		if(i*2+1<=sz&&hp[i*2+1].v>hp[i*2].v) j=i*2+1;
		else j=i*2;
		if(hp[j].v>hp[i].v){
			swap(hp[j],hp[i]);i=j;
		}
		else break;
	}
}
void pop(){
	hp[1]=hp[sz--];
	shift_down(1);
}
int main()
{
	int n;
	scanf("%d",&n);
	sz=0;
	for(int i=1;i<=n;i++){
		char op[25];
		scanf("%s",op);
		if(op[1]=='o'){
			if(sz==0){
				printf("none\n");
				continue;
			}
			node tmp=top();
			pop();
			printf("%s %d\n",tmp.nm,tmp.v);
		}else {
			node tmp;
			scanf("%s %d",tmp.nm,&tmp.v);
			push(tmp);
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏阳李老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值