//九度OJ教程31 哈夫曼树之搬运水果 (木有优先队列,利用两趟简单选择排序来实现的算法……C语言坑啊)
//http://ac.jobdu.com/problem.php?cid=1040&pid=30
#include <stdio.h>
#define MAXS 10005
//由于C里面没有优先队列,故,用简单选择排序两次来模拟哈夫曼树的带权路径长度……
int main()
{
long h[MAXS];
long s,n,a,i,j,k;
while(scanf("%d",&n)!=EOF)
{
if(n==0)return 0; //n为零时程序结束
if(n==1)
{
scanf("%lld",&s);
printf("%lld",s);
continue;
}
for(i=1;i<=n;i++)scanf("%d",&h[i]);
s=a=0;
while(n>2)
{
j=n;
for(i=k=1;i<=j;i++) //简单选择排序第一趟
{
if(h[i]<h[k])k=i;
}
a=h[k];
h[k]=h[j];
h[j--]=a;
for(i=k=1;i<=j;i++) //简单选择排序第二趟
{
if(h[i]<h[k])k=i;
}
a=h[k];
h[k]=h[j];
h[j]=a; //排序完成,末尾俩相加,再次进入该数组
h[n-1]+=h[n];
s+=h[--n];
}
s+=h[1]+h[2];
printf("%lld\n",s);
}
return 0;
}
//九度OJ教程31 哈夫曼树之搬运水果
最新推荐文章于 2021-05-12 09:00:00 发布