題目描述
在一個果園裡,多多已經将所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有果子合成一堆。
每一次合并,多多可以把兩堆果子合并到一起,消耗的體力等于兩堆果子的重量之和。可以看出,所有的果子經過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;
}