合并果子(二叉堆)
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;
}
谢谢
以上是关于合并果子(二叉堆)的主要内容,如果未能解决你的问题,请参考以下文章