http://bailian.openjudge.cn/dsj2017xly/G/
http://dsalgo.openjudge.cn/advance/10/-
描述
-
系统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
AC代码:
#include <iostream>
#include<cstdio>
#include<set>
using namespace std;
struct C{
int num;
int pri;
C(int n,int p):num(n),pri(p){}
bool operator<(const C& rhs)const{
return pri<rhs.pri;//右大优先大
}
};
int main(int argc, char** argv) {
//set默认根据Key值排序
set<C> client;
set<C>::iterator it;
int n;
//while (scanf("%d", &n)&&n!=0) { //正确写法
//while((scanf("%d,&n")==1)&&(n!=0)){//这么写不对
while(cin>>n&&n!=0){
if(n==1){
int k,p;
cin>>k>>p;
client.insert(C(k,p));
}
if(client.empty()==true){
cout<<"0"<<endl;
}
else if(n==2){
it=client.end();
it--;
cout<<(*it).num<<endl;
client.erase(*it);
}
else if(n==3){
it=client.begin();
cout<<(*it).num<<endl;
client.erase(*it);
}
}
return 0;
}