天天看點

c語言合并果子思路解釋,C語言 合并果子(類哈夫曼樹)問題

題目描述

在一個果園裡,多多已經将所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有果子合成一堆。

每一次合并,多多可以把兩堆果子合并到一起,消耗的體力等于兩堆果子的重量之和。可以看出,所有的果子經過n-1次合并之後就剩下一堆了。多多在合并果子時總消耗的體力等于每次合并所耗體力之和。

因為還要花大力氣把這些果子搬回家,是以多多在合并果子時要盡可能地節省體力。假定每個果子重量都為1,并且已知果子的種類數和果子的數目,你的任務是設計出合并次序方案,使多多耗費的體力最小,并輸出這個最小的體力耗費值。

例如有3中果子,數目依次為1,2,9 。可以先将1、2堆合并,新堆果子數目為3,耗費體力為3 。接着,将新堆與原先的第三堆合并,又得到新堆,數目為12,耗費體力為12 。是以多多總共消耗體力=3+12=15 。

輸入

輸入包括兩行,第一行是個整數n(1≤n≤10000),表示果子的種類數。第二行包含n個整數,用空格分隔,分别表示對應種類的果子的數目。

輸出

輸出包含一行整數,示所花費的最小體力值。

樣例輸入

3

1 2 9

樣例輸出

15

我的思路是先進行一次排序,然後對最小的兩個數求和,同時将結果放在另一個數組中、将這個結果覆寫第二小的樹,同時數組長度減一(為下一次的取數做準備),再排序、取數。。。下面是具體的代碼,但是問題是雖然可以得到正确的結果,但在學校的系統上交後卻提示出錯。請指教:

#include

#define maxn 10000

int bubble_sort(int a[],int n)

{

int i,j;

int t;

n--;

while(n>0)

{

j=0;

for(i=0;i

if(a[i]

{t=a[i];

a[i]=a[i+1];

a[i+1]=t;

j=i;

}

n=j;

}

}

int main()

{

int i,j,n,num,total,temp,final;

int a[maxn],b[maxn];

total=0;

scanf("%d",&num);

if(num>=1&&num<=10000)

{

n=num;

for(i=0;i

scanf("%d",&a[i]);

bubble_sort(a,n); temp=a[num-1];

for(j=num;j>=0;j--){

bubble_sort(a,n);

b[j-1]=a[j-1]+=a[j];

n=n-1;

}

for(j=num;j>=0;j--){

total+=b[j];

}

final=total-temp;

printf("%d",final);

}

return 0;

}