Description
在一個果園,多多已經將所有的果子都打了下來,而且按照果子的不同種類分成了不同的堆,多多決定將所有的果子合成一堆。
每一次合并,多多可以把兩堆果子合并到一起,消耗的體力等于兩堆果子的重量之和。可以看出,經過n-1次合并之后,就剩下一堆了。多多在合并果子時總共消耗的體力等于每次合并所耗體力之和。
因為多多還要花大力氣把這些果子搬回家,所以多多在合并果子時要要盡可能地節省體力。假定每個果子的重量都為1,并且已知果子的種類數和每種果子的數目,你的任務是設計出合并的次序方案,使多多耗費的體力最小,并輸出這個最小的體力耗費值。
假如有3種果子,數目依次為1、2、9,可以先將1、2堆合并,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合并,又得到新的堆,數目為12,耗費體力為12。所以多多總共耗體力=3+12=15。可以證明15為最小的體力耗費值。
Input
輸入第一行為整數M,表示有M個case(測驗實體)。
接下來每個case包含2行,第一行為整數n(1<=n<=10,000),表示果子的種類數,第二行包含n個整數,用空格分開,分別表示有每種果子的數目。
Output
每個case輸出最小的體力耗費值
Sample Input Copy
2
3
1 2 9
4
1 2 9 4
Sample Output Copy
15
26
#include<stdio.h>
#include<stdlib.h>
void sort(int a[],int n)
{
int i,temp;
for(i=0;i<n;i++)
{
if(a[i]<a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
int main()
{
int N,n,a[10001],s,m;
scanf("%d",&N);
while(N--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
s=0;
while(n>1)
{
for(int i=0;i<2;i++)
sort(a,n);
a[n-2]=a[n-1]+a[n-2];
s+=a[n-2];
n--;
}
printf("%d\n",s);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/78785.html
標籤:C++ 語言
