题目链接:
复数集合_牛客题霸_牛客网 一个复数(x+iy)集合,两种操作作用在该集合上: 1、Pop 表示读出集。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/437195121692724009060
描述
一个复数(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
思路:
- 定义复数结构
Complex
,包含实部real
和虚部imag
。 - 重载
Complex
类的小于运算符,按照复数模长大小比较,用于优先队列中的自动排序。 - 在
main
函数中,首先读取一个整数n
,表示操作次数。 - 创建一个优先队列
myQueue
,用于存储复数,并按照大小自动排序。 - 循环
n
次,根据输入的字符串判断是执行 "Pop" 操作还是插入操作。- 如果是 "Pop" 操作,判断队列是否为空,如果为空则输出 "empty",否则输出队列顶部复数的实部和虚部,然后弹出队列顶部元素,输出队列大小。
- 如果是插入操作,使用
scanf
读取复数的实部和虚部,创建一个Complex
对象并插入优先队列,输出队列大小。
- 循环结束后程序终止。
源代码:
#include<iostream>
#include<string>
#include<vector>
#include<queue>
using namespace std;
// 定义复数结构
struct Complex {
int real; // 实部
int imag; // 虚部
Complex(int a, int b) : real(a), imag(b) {} // 构造函数
// 重载小于运算符,用于优先队列的比较
bool operator<(Complex c) const {
return real * real + imag * imag < c.real * c.real + c.imag * c.imag;
}
};
int main() {
int n;
while (cin >> n) {
priority_queue<Complex> myQueue; // 创建一个优先队列,按照复数大小自动排序
for (int i = 0; i < n; i++) {
string s;
cin >> s;
if (s == "Pop") {
if (myQueue.empty()) {
cout << "empty" << endl; // 队列为空,输出 "empty"
}
else {
// 输出队列顶部复数的实部和虚部,并弹出队列顶部元素
cout << myQueue.top().real << "+i" << myQueue.top().imag << endl;
myQueue.pop(); // 弹出队列顶部元素
cout << "SIZE = " << myQueue.size() << endl; // 输出队列大小
}
}
else {
int a, b;
scanf("%d+i%d", &a, &b); // 读取复数的实部和虚部
myQueue.push(Complex(a, b)); // 将复数插入优先队列
cout << "SIZE = " << myQueue.size() << endl; // 输出队列大小
}
}
}
return 0;
}
提交结果: