计蒜客.T3603.叫号系统

题目来源

目录

题目大意

示例一

示例二

解题思路

实现代码及注释


题目大意

一个病人到达医院后,会自动挂号、评测病情的紧急程度,并且会将信息加入到医院的叫号系统。叫号系统内保证所有排队的病人中所有的id 和紧急程度 urg 均不相同。

医院的叫号系统非常奇怪,我们认为叫号系统有多种操作,对于每种操作都会有一个操作编号 op,操作包括:

  • 若op=1,认为医院来了一个新的病人,编号为 id,病情的紧急程度为urg,需要将他的信息加入到叫号系统内。
  • 若op=2,医生现在开始叫号,医生会选择紧急程度最小的病人。输出此病人的 id 并将他的信息从叫号系统中删除;如果没有这样的病人,则输出 error
  • 若 op=3,医生现在开始叫号,医生会选择紧急程度最大的病人。输出此病人的 id 并将他的信息从叫号系统中删除;如果没有这样的病人,则输出 error
  • 若op=4,将叫号系统中编号为id 的病人的紧急程度修改为urg。叫号系统中一定有该病人,并且新的紧急程度与其他病人的紧急程度不冲突。
  • 若 op=5,将叫号系统中紧急程度为urg 的病人的编号修改为 id。叫号系统中一定有该病人,并且新的编号与其他病人的编号不冲突。
  • 若 op=6,医生想要查询编号为 id 的病人的紧急程度并输出,如果没有该病人,则输出 error
  • 若 op=7,医生想要查询紧急程度为 urg 的病人的编号并输出,如果没有该病人,则输出 error

输入格式

第一行,一个正整数 n,表示操作的数量。

接下来 n 行,代表每次操作,每行的第一个数为 op,若:

  • op=1,输入两个以空格隔开的正整数id,urg;
  • op=2,该行没有其它输入。
  • op=3,该行没有其它输入。
  • op=4,输入两个以空格隔开的正整数 id,urg;
  • op=5,输入两个以空格隔开的正整数id,urg;
  • op=6,输入一个正整数id;
  • op=7,输入一个正整数 urg。

保证数据一直合法,并且变量含义如题意所示。

输出格式

输出若干行,依次按照操作 2∼3,6∼7,按照要求进行输出。

数据范围

对于30% 的数据,1≤n≤100;

对于 60% 的数据,1≤n≤1000;

对于100% 的数据,1≤n≤105,1≤op≤7,1≤id≤105,1≤urg≤105;

格式说明

输出时每行末尾的多余空格,不影响答案正确性

示例一

样例输入1

7


1 2 3

1 3 4

6 3

7 3

4 3 5

2

3

样例输出1

4

2

2

3

样例解释1
  • 操作 1,向叫号系统内添加编号为 2 病情紧急程度为 3 的病人信息
  • 操作 1,向叫号系统内添加编号为 3 病情紧急程度为 4 的病人信息
  • 操作 6,编号 3 的病人的病情紧急程度为:4
  • 操作 7,紧急程度为 3 的病人的编号为:2
  • 操作 4, 将编号 3 的病人的病情紧急程度修改为:5
  • 操作 2,当前叫号系统内的病人信息有:
    • 病人信息 1, 编号:2, 病情紧急程度:3
    • 病人信息 2, 编号:3, 病情紧急程度:5
    • 当前最小的紧急程度为: 3
  • 操作 3,当前叫号系统内的病人信息有:
    • 病人信息 1, 编号:3, 病情紧急程度:5
    • 当前最大的紧急程度为: 5

示例二

样例输入2

11

1 1 19

1 3 12

3

1 3 11

2

1 4 8

4 4 9

2

5 11 7

3

6 5

样例输出2

1 3

4

3

error

样例解释2
  • 操作 1,向叫号系统内添加编号为 1 病情紧急程度为 19 的病人信息
  • 操作 1,向叫号系统内添加编号为 3 病情紧急程度为 12 的病人信息
  • 操作 3,当前叫号系统内的病人信息有:
    • 病人信息 1, 编号:1, 病情紧急程度:19
    • 病人信息 2, 编号:3, 病情紧急程度:12
    • 当前最大的紧急程度为: 19
  • 操作 1,向叫号系统内添加编号为 3 病情紧急程度为 11 的病人信息
  • 操作 2,当前叫号系统内的病人信息有:
    • 病人信息 1, 编号:3, 病情紧急程度:11
    • 病人信息 2, 编号:3, 病情紧急程度:12
    • 当前最小的紧急程度为: 11
  • 操作 1,向叫号系统内添加编号为 4 病情紧急程度为 8 的病人信息
  • 操作 4, 将编号 4 的病人的病情紧急程度修改为:9
  • 操作 2,当前叫号系统内的病人信息有:
    • 病人信息 1, 编号:4, 病情紧急程度:9
    • 病人信息 2, 编号:3, 病情紧急程度:12
    • 当前最小的紧急程度为: 9
  • 操作 5, 将病情紧急程度 7 的病人的编号修改为:11
  • 操作 3,当前叫号系统内的病人信息有:
    • 病人信息 1, 编号:3, 病情紧急程度:12
    • 当前最大的紧急程度为: 12
  • 操作 6,当前叫号系统内没有编号为 5 的病人

解题思路

因为此题要求我们查找、更改紧急程度最小的病人,紧急程度最大的病人,编号为id的病人,经济成大为urg的病人等,所以我们可以创建一个map容器用来将编号为id与紧急程度为urg所对应地放置在容器中,并且map容器还可以自动排序,所以我们在找urg最小或urg最大的病人的id时,执教找容器中的第一个或最后一个所对应的id即可。

实现代码及注释

#include<cstdio>
#include<map>//定义一个map容器
using namespace std;
typedef long long ll;
int main()
{
	map<ll,ll> a,b;
	ll n,op,id,urg;
	scanf("%lld",&n);
	while(n--)
	{
		scanf("%lld",&op);//输入op
		if(op==1)
		{
			scanf("%lld%lld",&id,&urg);
			a[id]=urg;
			b[urg]=id;
		}
		if(op==2)
		{
			if(b.size()==0)//若容器内长度为0
			printf("error\n");//则输出error
			else
			{
				printf("%lld\n",b.begin()->second);//输出指向容器中第一个(注意,是已排好序的第一个)所对应的value值,即urg最所对应的病人的id
				a.erase(b.begin()->second);//将此病人的id删除
				b.erase(b.begin());//将此病人的urg删除
			}
		}
		if(op==3)
		{
			if(a.size()==0)
			printf("error\n");
			else
			{
				printf("%lld\n",(--b.end())->second);//输出指向容器中最后一个(注意,是已排好序的最后一个)所对应的value值,即urg最大所对应的病人的id
				a.erase((--b.end())->second);//将此病人的id删除
				b.erase(--b.end());//将此病人的urg删除
			}
		}
		if(op==4)
		{
			scanf("%lld %lld",&id,&urg);
			b.erase(a[id]);//将id号病人的urg值删除
			a[id]=urg;//更新其urg
			b[urg]=id;//将此时的urg与id相对应
		}
		if(op==5)
		{
			scanf("%lld %lld",&id,&urg);
			a.erase(b[urg]);//将值为urg的病人的id删除
			a[id]=urg;//将更新其id
			b[urg]=id;//将其urg与id相对应
		}
		if(op==6)
		{
			scanf("%lld",&id);
			if(a.find(id)==a.end())//查询编号为id的病人,若查到最后一位的后一位还是没有,则输出error
			printf("error\n");
			else
				printf("%lld\n",a[id]);
		}
		if(op==7)
		{
			scanf("%lld",&urg);
			if(b.find(urg)==b.end())//查询紧急程度为urg的病人,若查到最后一位的后一位还是没有,则输出error
				printf("error\n");
			else
				printf("%lld\n",b[urg]);
		}
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值