题目描述:
一个复数(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都是非负数。
代码实现:
#include <cstdio>
#include <queue>
#include <string>
using namespace std;
struct Complex{
int re;
int im;
};
bool operator < (Complex lhs,Complex rhs){
return lhs.re*lhs.re + lhs.im*lhs.im < rhs.re *rhs.re + rhs.im*rhs.im;
}
int main(){
int n;
scanf("%d",&n);
priority_queue<Complex> pqueue;
for (int i=0;i<n;++i){
char action[30];
scanf("%s",action);
string actionstr = action;
if(actionstr == "Pop"){
if(pqueue.empty()){
printf("empty\n");
}
else{
printf("%d+i%d\n",pqueue.top().re,pqueue.top().im);
pqueue.pop();
printf("SIZE = %d\n",pqueue.size());
}
}
else if (actionstr == "Insert"){
int re,im;
scanf("%d+i%d",&re,&im);
Complex c;
c.re = re;
c.im = im;
pqueue.push(c);
printf("SIZE = %d\n",pqueue.size());
}
}
}
输入
3
Pop
Insert 1+i2
Pop
输出
empty
SIZE = 1
1+i2
SIZE = 0