Description
现在有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
Hint
Source
国防科学技术大学第十八届银河之光文化节ACM程序设计竞赛初赛代码:
#include <iostream> #include <cstring> #include <map> #include <cstdlib> #include <queue> using namespace std; struct fruit { int num; friend bool operator< (fruit a,fruit b) { return a.num>b.num; } }value; int main() { int T,n,ai,Sum,sum;///Sum 记录总的 sum记录每次合并的两堆的和 priority_queue<fruit>f; cin>>T; while(T--) { Sum=0; cin>>n; for(int i=0;i<n;i++) { cin>>ai; value.num=ai; f.push(value); } while(f.size()>=2) { sum=f.top().num; f.pop(); sum+=f.top().num; f.pop(); Sum+=sum; value.num=sum; f.push(value); } f.pop();///别忘了清空队列啊 cout<<Sum<<endl; } }
如果觉得有帮助,点个推荐啦~