这个问题不是很麻烦,我之前做ACM试题遇到过考察哈夫曼树,这类题目都差不多,直接给你C代码吧!思路:
求最小值:每取2个当前数组中的最小,申请2个变保证每次2个变量中的值值是当前的最小值便可,将2个数合并之后必有一个数取消在数组中的位置,可以将该数改成一个较大的数,将此空间和谐掉,最后按照题意m和n的序列需要m+n-1次比较这样便求出了最小值。
求最大值:将数组从大到小排列,依次相加前两位便可.
#include<stdio.h>
#include<stdlib.h>
void main()
{
int num,min,max,*arrmax,*arrmin,i,j,a,b,k,temp;
scanf("%d",&num);
arrmax=(int *)malloc(num * sizeof(int));
arrmin=(int *)malloc(num * sizeof (int));
for(i=0;i<num;i++)
{
scanf("%d",&arrmax[i]);
arrmin[i]=arrmax[i];
}
for(min=0,i=0;i<num-1;i++
{
a=0,b=1;//数组编号
for(j=2;j<num;j++)
{
if(arrmin[j]<arrmin[a]||arrmin[j]<arrmin[b])
{
if(arrmin[a]>arrmin[b])
a=j;
else
b=j;
}
}
min+=(arrmin[a]+arrmin[b]);
arrmin[a]+=arrmin[b];
arrmin[b]=888888888;
}
min-=(num--);
for(i=0;i<num;i++)
{
for(k=i,j=i+1;j<num;j++)
if(arrmax[k]<arrmax[j])
k=j;
temp=arrmax[k];
arrmax[k]=arrmax[i];
arrmax[i]=temp;
}
for(max=0,i=0;i<num-1;i++)
{
max+=(arrmax[i]+arrmax[i++]);
arrmax[i++]+=arrmax[i];
}
max-=(num--);
printf("%d %d\n",max,min);
}
|