BUPT复试专题—复数集合(?)
https://www.nowcoder.com/practice/abdd24fa839c414a9b83aa9c4ecd05cc?tpId=67&tqId=29643&rp=0&ru=/kaoyan/retest/1005&qru=/ta/bupt-kaoyan/question-ranking
题目描述
一个复数(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
维护一个struct做查询插入删除操作
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<string.h> #include<string> #include<queue> using namespace std; struct complex { int x; int y; int dis; }; int main() { int num; while(scanf("%d",&num)!=EOF) { complex rec[1000]; int size=0; while(num--) { string donser,ins; cin>>donser; if(donser[0]=='P') { if(size==0) { cout<<"empty"<<endl; continue; } else { int xi,yi,maxnum=0,maxi; for(int i=0;i<size;i++) { complex temp; temp=rec[i]; if(temp.dis>maxnum) { maxnum=temp.dis; xi=temp.x; yi=temp.y; maxi=i; } } for(int i=maxi+1;i<size;i++) rec[i-1]=rec[i]; cout<<xi<<"+i"<<yi<<endl<<"SIZE = "<<--size<<endl; } } else if(donser[0]=='I') { cin>>ins; complex temp; temp.x=temp.y=0; int i=0; while(ins[i]!='+') { temp.x*=10; temp.x+=ins[i]-'0'; i++; } i+=2; while(ins[i]!='\0') { temp.y*=10; temp.y+=ins[i]-'0'; i++; } temp.dis=temp.x*temp.x+temp.y*temp.y; rec[size]=temp; cout<<"SIZE = "<<++size<<endl; } } } return 0; }