题目描述

一个复数(x+iy)集合,两种操作作用在该集合上: 1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出 empty ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE; 2 Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE; 最开始要读入一个int n,表示接下来的n行每一行都是一条命令。

输入描述

输入有多组数据。
每组输入一个n(1<=n<=1000),然后再输入n条指令。

输出描述

根据指令输出结果。
模相等的输出b较小的复数。
a和b都是非负数。

示例1
输入

3
Pop
Insert 1+i2
Pop

输出

empty
SIZE = 1
1+i2
SIZE = 0

注意

使用结构体排序
每次需要更新集合的大小
注意size的大小写

版本1

#include
using namespace std;

struct node{
    int a,b;
}E[1005];
bool cmp(node a, node b){
    int m1=a.a*a.a + a.b*a.b;
    int m2=b.a*b.a + b.b*b.b;
    if(m1 != m2) return m1 < m2;
    else return a.b > b.b;
}
int main(){
    int n,a,b,x; 
    while(cin>>n){
        string s;
        int k=0;
        while(n--){
            cin>>s;
            if(s=="Pop"){
                if(k==0) cout<<"empty"<<endl;
                else{
                    sort(E,E+k,cmp);
                    cout<<E[k-1].a<<"+i"<<E[k-1].b<<endl;
                    k--;
                    cout<<"SIZE = "<<k<<endl;
                }
            }else{
                cin>>s;
                x=0;
                for(int i=0;i<s.size();i++){
                    if(s[i]>='0'&&s[i]<='9'){
                        x = x*10 + s[i]-'0';
                    }else if(s[i]=='+'){
                        a=x;
                        x=0;
                        i++;
                    }
                }
                b = x;
                E[k].a=a;
                E[k].b=b;
                k++;
                cout<<"SIZE = "<<k<<endl;
            }
        }    
    }
    return 0;
}