C语言实现建立最大堆以及pop操作

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);
}

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/83247011