//九度OJ教程31 哈夫曼树之搬运水果

//九度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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值