G:双队列
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
系统A用来维护客户。每个客户的id用一个正整数K来表示,当客户进入系统时用P来表示此用户的优先度。这个系统有以下请求
0
系统停止运行
1 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;
}