使用priority_queue,并且重载运算符就可以。但是要注意优先队列是大根堆。和sort是相反的。
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
struct complex
{
int a;int b;
inline bool operator < (const complex &c)const{
if((a*a+b*b)==(c.a*c.a+c.b*c.b)){
return c.b>b;
}return (a*a+b*b)<(c.a*c.a+c.b*c.b);
}
};
int main()
{
int n;
string s;
while(cin>>n){
getchar();
priority_queue<complex> q;
complex c;
for(int i=0;i<n;i++){
getline(cin,s);
//cout<<s<<endl;
if(s[0]=='P'){
if(q.empty())
printf("empty\n");
else{
c=q.top();q.pop();
printf("%d+i%d\n",c.a,c.b);
printf("SIZE = %d\n",q.size());
}
}else if(s[0]=='I'){
int pos=s.find(" ")+1;
int num=0;
while(s[pos]>='0'&&s[pos]<='9'){
num=num*10+s[pos]-'0';
pos++;
}
c.a=num;
pos+=2;
num=0;
while(s[pos]>='0'&&s[pos]<='9'){
num=num*10+s[pos]-'0';
pos++;
}
c.b=num;
q.push(c);
printf("SIZE = %d\n",q.size());
}
}
}
return 0;
} 


京公网安备 11010502036488号