题解 | #复数集合#
复数集合
https://www.nowcoder.com/practice/abdd24fa839c414a9b83aa9c4ecd05cc
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Tnode {
int real;//实部
int vir;//虚部
int abs;//复试的模值
} Tnode;
void adjust(Tnode* x, int y,
int len) { //调整子树为大根堆 ,y是父亲位置
int dad = y;
int son = dad * 2 + 1;
while (son < len) {
if (son + 1 < len && x[son].abs < x[son + 1].abs) {
son++;
} else if (son + 1 < len && x[son].abs == x[son + 1].abs) {
if (x[son].real < x[son + 1].real) {
son++;
}
}
if (x[son].abs > x[dad].abs) {
Tnode temp;
temp = x[dad];
x[dad] = x[son];
x[son] = temp;
dad = son;
son = 2 * dad + 1;
} else if (x[son].abs == x[dad].abs) {
if (x[son].real > x[dad].real) { //儿子大于父亲
Tnode temp;
temp = x[dad];
x[dad] = x[son];
x[son] = temp;
dad = son;
son = 2 * dad + 1;
}
} else {
break;
}
}
}
void makebigheap(Tnode* x, int len) { //构造大根堆
for (int i = len / 2 - 1; i >= 0; i--) {
adjust(x, i, len);
}
}
int main() {
int n;
// memset(&a, 0,sizeof(Tnode));
while (scanf("%d\n", &n) != EOF) {
Tnode a[1000];//大根堆数组
int num = 0; //堆内有几个元素
char tmp[20];
for (int i = 0; i < n; i++) {
scanf("%s", &tmp);
// gets(tmp);
if (tmp[0] == 'P') { //pop指令操作
if (num == 0) {
printf("empty\n");
continue;
} else {
num--;
printf("%d+i%d\n", a[0].real, a[0].vir);
printf("SIZE = %d\n", num);
a[0] = a[num];
adjust(a, 0, num);
continue;
}
} else { //insert指令操作
scanf("%d+i%d", &a[num].real, &a[num].vir);
a[num].abs = a[num].real * a[num].real + a[num].vir * a[num].vir;
num++;
printf("SIZE = %d\n", num);
makebigheap(a, num);
continue;
}
}
}
}
腾讯成长空间 1100人发布