如今有n堆果子,第i堆有ai个果子。如今要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并全部果子的最小代价。 Input 第一行包含一个整数T(T<=50),表示数据组数。 每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。 第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。 Output 每组数据仅一行,表示最小合并代价。 Sample Input 2 4 1 2 3 4 5 3 5 2 1 4 Sample Output 19 33
简单的贪心,直接对果子数量从小到大排序,每次把前两个合并在一块儿,变成一堆果子,而后再从新排序。c++
每合并一次就要从新排序。spa
#include <bits/stdc++.h> using namespace std; int main() { int t,i; cin>>t; while(t--) { int s=0; //用来存代价 int k=0; //用来存每次合并以后最小的果子数 int n,a[1005]; cin>>n; for(i=0;i<n;i++) cin>>a[i]; sort(a,a+n); //对输入进的果子数进行排序 s=a[0]; //把最小的果子数复制给s for(i=1;i<n;i++) //循环n-1次,每循环一次,合并一次果子,从新排序一次 { a[i-1]=s; sort(a+i-1,a+n); s=a[i-1]; s=s+a[i]; k=k+s; } cout<<k<<endl; } return 0; }