Problem Description
有1<=n<=20000个木棒,要把这n个木棒还原为一根并且每次只可以两个相连接,费用就是每次要接的两个木棒的长度和,要求就是把这个棒还原,要求费用最小。
Input
输入包含多组测试数据,每组测试数据第一行是一个正整数n,接下来n行,每行一个数字,代表木棒长度。
Output
对于每组测试数据,输出一行正整数,表示把棒还原的最小费用。
Sample Input
Sample Output
Author
kg1991
代码如下:
#include<stdio.h>
int node[20005];
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void heap(int i)
{
int left = i*2,right=i*2+1,mins = i;
if(left<=node[0]&&node[left]<node[mins])
mins = left;
if(right<=node[0]&&node[right]<node[mins])
mins = right;
if(i!=mins)
{
swap(&node[i],&node[mins]);
heap(mins);
}
}
void inheap(int key)
{
node[++node[0]] = key;
int i = node[0];
while(i>1&&node[i]<node[i/2])
{
swap(&node[i],&node[i/2]);
i = i/2;
}
}
int get()
{
int p = node[1],q;
node[1] = node[node[0]];
node[0]--;
heap(1);
q = node[1];
node[1] = node[node[0]];
node[0]--;
heap(1);
inheap(p+q);
return p+q;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
node[0] = 0;
for(i=1;i<=n;i++)
{
scanf("%d",&node[i]);
inheap(node[i]);
}
int ans = 0;
for(i=1;i<n;i++)
{
ans+=get();
}
printf("%d\n",ans);
}
return 0;
}