题目描述
一个复数(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; }