合并果子(二叉堆)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并果子(二叉堆)相关的知识,希望对你有一定的参考价值。

合并果子

在这里插入图片描述

解题思路

这题用的是二叉堆中的小根堆
搬上百度百科的二叉堆

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,len,ans,tree[10005];
void put(int x)//进堆
{
	tree[++len]=x;
	int son=len;
	while(son>1)
	{
		int fa=son/2;
		if(tree[son]>=tree[fa])return;
		swap(tree[son],tree[fa]);
		son=fa;
	}
	return;
}
int get()//取值
{
	int res=tree[1];
	tree[1]=tree[len--];
	int fa=1;
	while(fa*2<=len)
	{
		int son=fa*2;
		if(son+1<=len&&tree[son]>tree[son+1])son++;
		if(tree[son]>tree[fa])break;
		swap(tree[son],tree[fa]);
		fa=son;
	}
	return res;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		put(x);
	}
	for(int i=1;i<n;i++)
	{
		int x=get(),y=get();//取出来
		ans+=x+y;//求结果
		put(x+y);//入堆
	}
	printf("%d",ans);
	return 0;	
} 

谢谢

以上是关于合并果子(二叉堆)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1090 合并果子

P1090 合并果子

序列合并(二叉堆)

果堆合并(急求PASCAL 哈夫曼树解法)!

左式堆

二叉堆和d-堆的性能比较