题解 | 复数集合
复数集合
https://www.nowcoder.com/practice/abdd24fa839c414a9b83aa9c4ecd05cc
优先队列:默认大根堆,重载运算符的比较规则有点绕
#include<stdio.h>
#include<string>
#include<queue>
using namespace std;
struct Complex {
int a;
int b;
Complex(int a_, int b_) {
a = a_;
b = b_;
}
};
//因为默认的比较规则只能比较int和double类型,故自定义运算符,重载 < 号
//注意:(a<b)为真或(a>b)为真,都是a(左边那个)输了,谁被判定为输(返回 true),谁就要被挤到下面去
bool operator<(Complex l, Complex r) {
//比较复数模
if (l.a * l.a + l.b * l.b < r.a * r.a + r.b * r.b) {
return true;//复数模最大的排前,l输了
} else if ((l.a * l.a + l.b * l.b == r.a * r.a + r.b * r.b) && l.b > r.b) {
return true;//复数模相等时,l.b输了
} else {
return false;//小根堆
}
}
int main() {
int n;
char arr[100];
string action;
priority_queue<Complex> myqueue;//定义一个优先队列
scanf("%d", &n);
while (n--) {
scanf("%s", arr);
action = arr;
if (action == "Pop") {
if (myqueue.empty()) {//空
printf("empty\n");
} else { //不空
printf("%d+i%d\n", myqueue.top().a, myqueue.top().b);
myqueue.pop();
printf("SIZE = %d\n", myqueue.size());
}
} else if (action == "Insert") {
int a, b;
scanf("%d+i%d", &a, &b);//格式化输入
Complex c(a, b);
myqueue.push(c);
printf("SIZE = %d\n", myqueue.size());
}
}
return 0;
}
计算机复试机试(王道版) 文章被收录于专栏
收录王道2026年计算机复试机试的(课程)代码题解,仅供个人学习参考