现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。
标签:
现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。
第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。
每组数据仅一行,表示最小合并代价。
2
4
1 2 3 4
5
3 5 2 1 4
19
33
(优先队列 +或者+哈夫曼)
#include<stdio.h> #include<queue> using namespace std; struct node { int a; friend bool operator<(node aa,node bb) { return aa.a>bb.a; } }; int main() { int n,t,a,sum; node bb,aa; scanf("%d",&t); while(t--) { priority_queue<node>q; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a); bb.a=a; q.push(bb); } sum=0; while(!q.empty()) { aa=q.top(); q.pop();//printf("%d ",aa.a); if(n==1) break; bb=q.top(); q.pop(); n--; aa.a+=bb.a; sum+=aa.a; q.push(aa); } printf("%d\n",sum); } } /************************************************************** Problem: 1588 User: aking2015 Language: C++ Result: Accepted Time:92 ms Memory:1064 kb ****************************************************************/
标签:
原文地址:http://www.cnblogs.com/yuyixingkong/p/4471260.html