之前做这个题利用了c++的priority_queue
#include<stdio.h>
int n;
int a[200005];
int main()
{
int t,i,temp;
long long x=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
getchar();
}
while(n>1)
{
int min1=0,min2=1;
if(a[min1]>a[min2])//找出最短和次短的两块木板分别为min1,min2
{
temp=min1;
min1=min2;
min2=temp;
}
for(i=2; i<n; i++)
{
if(a[i]<a[min1])
{
min2=min1;
min1=i;
}
else if(a[i]<a[min2])
{
min2=i;
}
}
//将两块木板合并为t
//printf("最短%d 次短 %d \n",a[min1],a[min2]);
t=a[min1]+a[min2];
x=x+t;
//如果最小值正好为数组的最后一位,就直接删掉
if(min1==n-1)
{
a[min2]=t;//将合并后的木板T重新放入数组
}else
{
a[min1] = t;
a[min2] = a[n-1];
}
n--;//数组长度减少1
}
printf("%lld\n",x);
return 0;
}