WA了一天了,不就是一个哈夫曼树么,真的崩溃了。
题意是这样的,比如输入3 8 5 8,相当于8+5+8=21,然后21+5+8=34。
代码如下
#include<stdio.h>
__int64 sum;
int b[20005];
int h,len;
int pt(int i)
{
return i/2;
}
int lt(int i)
{
return 2*i;
}
int rt(int i)
{
return 2*i+1;
}
int mh(int i)
{
int l,r,lg,t;
l=lt(i);
r=rt(i);
if(l<=h&&b[l]<b[i])
lg=l;
else
lg=i;
if(r<=h&&b[r]<b[lg])
lg=r;
if(lg!=i)
{
t=b[i];
b[i]=b[lg];
b[lg]=t;
mh(lg);
}
}
int bmh()
{
int i;
h=len;
for(i=len/2;i>0;i--)
mh(i);
}
int hem()
{
int min=b[1];
b[1]=b[h];
h--;
mh(1);
return min;
}
int hink(int i,int key)
{
int t;
b[i]=key;
mh(1);
}
void main()
{
int n,i,j,t;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
len=n;
bmh();
while(h>1)
{
t=hem();
t+=b[1];
sum+=t;
hink(1,t);
}
printf("%I64d\n",sum);
}
}