题目描述
一个复数(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 <iostream>
#include <queue>
using namespace std;
typedef struct Complex {
int real;
int imag;
// 重载小于号
// operate 不对, 是 operator!!
bool operator < (Complex a)const {
if (real * real + imag * imag == a.real * a.real + a.imag * a.imag) {
return imag < a.imag;
} else {
return real * real + imag * imag < a.real * a.real + a.imag * a.imag;
}
}
} Complex;
priority_queue<Complex> pq;
int main() {
int n;
while(cin >> n) {
string op;
int real,imag;
Complex t;
for (int i = 1; i <= n; i++) {
cin >> op;
if (op == "Pop") {
if (pq.empty()) {
cout << "empty" << endl;
continue;
} else {
t = pq.top();
cout << t.real << "+i" << t.imag << endl;
pq.pop();
cout << "SIZE = " << pq.size() << endl;
}
} else if (op == "Insert") {
scanf("%d+i%d",&real,&imag);
t.real = real;
t.imag = imag;
pq.push(t);
cout << "SIZE = " << pq.size() << endl;
}
}
}
}