题解:
如果每次都排序一遍肯定会超时的,可以使用 STL 中自动排序的 Set ,因为是两个数,所以加上 pair 就可以。
如果是2,那就尾部选一个,然后删除掉。
如果是3,就从头选一个,然后删除掉。
加上 pair 排序就是先按第一个排,再按第二个,都是从小到大的顺序。
注意 set 的begin( ) 和 end( ) 。
一开始的憨憨思路:
最初想的是用两个优先队列,一个大的,一个小的,然后开两个map ,一个记录优先值,一个记录是否把该数删除掉,理论上自己臆想还可以哈哈哈,不过后来发现了这样很麻烦,写了会就放弃了,有一些样例不好处理。
正好复习一下 set 和 pair 使用。
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
int main()
{
int q,k,p;
set<pair<int ,int > > st;
set<pair<int, int> > :: iterator it;
while(cin >> q && q){
if(q == 1){
cin >> k >> p;
st.insert(make_pair(p,k));
}
else if(q == 2){
if(st.empty()){
cout << 0 << endl;
}
else {
it = st.end();
it--;
cout << it->second << endl;
st.erase(it);
}
}
else if(q == 3){
if(st.empty()){
cout << 0 << endl;
}
else {
it = st.begin();
cout << it->second << endl;
st.erase(it);
}
}
}
return 0;
}
某个银行很傲娇,来了一些客户,有时先接待优先级最高的客户,有时先接待优先级最低的客户,有如下四种操作:
0:系统停止服务。
1 K P:增加一个 ID 为 K(Kleq 10^6)的客户,其优先级是 P(Pleq 10^7)。
2:查询优先级最高的客户,接待他,并从等候队列里删除。
3:查询优先级最低的客户,接待他,并从等候队列里删除。
你的任务是依次输出这些客户的 ID。
输入格式
若干行,以 0 结束(总操作数不超过 10^5)。
一个客户可能访问多次;保证在任意时刻,队列中的优先级各不相同。
输出格式
对于 2 和 3 操作,一行一个整数表示 D,若查询无结果,则输出 0。