机试训练1 双队列 set的使用

G:双队列

总时间限制: 
1000ms
内存限制: 
65536kB
描述

系统A用来维护客户。每个客户的id用一个正整数K来表示,当客户进入系统时用P来表示此用户的优先度。这个系统有以下请求

0

系统停止运行

K P

优先度为P的客户K进入系统

2

找到优先度最高的客户,然后此客户离开系统

3

找到优先度最低的客户,然后此客户离开系统

输入
每行包括一个请求,最后一行包括一个停止请求(代码0)。对于添加客户请求(代码1),优先度都是唯一的。客户的表示K小于10 6,优先度P小于10 7,一个客户可能会被添加多次,每次的优先度可能不同。
输出
对于每个请求2和3,程序必须输出一行。这行包括此请求中找到客户的id。如果系统中没有客户,输出0
样例输入
21 20 141 30 321 10 993220
样例输出

02030100




set集合是c++ stl库中自带的一个容器,set具有以下两个特点:

1、set中的元素都是排好序的

2、set集合中没有重复的元素

常用操作:

begin()    返回set容器的第一个元素的地址

end()      返回set容器的最后一个元素地址

clear()    删除set容器中的所有的元素

empty()     判断set容器是否为空

max_size()   返回set容器可能包含的元素最大个数

size()      返回当前set容器中的元素个数

erase(it) 删除迭代器指针it处元素

insert(a) 插入某个元素 



#include<stdio.h>
#include<set>
using namespace std;
struct C
{
int num;
int pri;
bool operator <(const C&A) const
{
return pri<A.pri;
}
};
int main()
{
set<C> Q;
set<C>::iterator it;         
                                        attention!
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
else if(n==1)
{
C tmp;
scanf("%d%d",&tmp.num,&tmp.pri);
Q.insert(tmp);
}
else if(n==2)
{
if(Q.empty()!=false)
{
printf("0\n");
}
else
{
it=Q.end();
it--;                                //注意此处一定要--!
printf("%d\n",(*it).num);
Q.erase(it);
}
}
else if(n==3)
{
if(Q.empty()!=false)
{
printf("0\n");
}
else
{
it=Q.begin();
printf("%d\n",(*it).num);
Q.erase(it);
}
}
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值