复数集合
描述
一个复数(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
分析:
因为涉及多次输入输出且要求有序,
采用了优先队列的重载运算符
具体做法可见优先队列笔记
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,x,flag,a[1010],sum;
string s;
struct compare{
int real;//实部
int imag;//虚部
};
//当左边的模小于右边的模时触发交换
bool operator < (compare lhs,compare rhs){//构建的为模大根堆
return lhs.real*lhs.real+lhs.imag*lhs.imag<rhs.real*rhs.real+rhs.imag*rhs.imag;
}
int main(){
while(cin>>n){
priority_queue<compare> q;
while(n--){
cin>>s;//cin以空格为界可以分割开insert和a+b;
if(s=="Pop"){
if(q.empty())
cout<<"empty"<<endl;
else{
printf("%d+i%d\n",q.top().real,q.top().imag);
q.pop();
printf("SIZE = %d\n",q.size());
}
}
else{
int a,b;
scanf("%d+i%d",&a,&b);
compare c;
c.real=a;
c.imag=b;
q.push(c);
printf("SIZE = %d\n",q.size());
}
}
}
return 0;
}