1
Max Heap(75分)
题目内容:
實作Max heap的三種操作:push, pop, top。
指令0 x:代表push,將x push進max heap。
指令1 : 代表pop,將最大的數字pop出來,若heap為空則忽略這道指令。
指令2 : 代表top,將最大的數字印出來,若heap為空則忽略這道指令。
输入格式:
本題只有一道測資。
測資第一行為一個數字N,代表接下來有N行指令。每行指令個格式如題目敘述。
所有push的數字皆不相同。
0 < N < 20000
0 < x < 10000000
输出格式:
將所有top指令輸出的數字作加總,最後輸出這個和。
Hint : 注意overflow!
输入样例:
15
1
0 9550684
0 8533293
1
2
2
1
0 505825
0 9809892
0 1484329
0 4958409
0 3788064
0 28006
2
0 2979864
输出样例:
26876478
这里为了简单,直接使用全局变量数组和size来表示堆
#include<stdio.h>
#include<stdlib.h>
#define MAXN 20001
#define MAX 10000001
long H[MAXN], size;
void Create()
{
size = 0;
H[0] = MAX; // 设置岗哨
}
void Insert(long X)
{
int i;
for (i = ++size; H[i / 2] < X; i /= 2)
H[i] = H[i / 2];
H[i] = X;
}
void pop()
{
int Parent, Child;
long MaxItem, X;
if (size == 0)
return;
MaxItem = H[1];
X = H[size];
size--;
for (Parent = 1; Parent * 2 <= size; Parent = Child)
{
Child = Parent * 2;
if (Child != size && (H[Child] < H[Child + 1]))
{
Child++;
}
if (X >= H[Child])
break;
else
H[Parent] = H[Child];
}
H[Parent] = X;
}
int main()
{
int n,temp;
long x;
long long ans=0;
scanf_s("%d", &n);
Create(); // 建堆
while (n--)
{
scanf_s("%d", &temp);
if (temp == 0)
{
scanf_s("%ld", &x);
Insert(x);
}
else if (temp == 1)
{
pop();
}
else if (temp == 2)
{
if (size > 0)
{
ans += H[1];
}
}
}
printf("%lld\n", ans);
}