现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。
Input第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。
每组数据仅一行,表示最小合并代价。
#include <iostream> #include <queue> #include <vector> #include <functional>//尼玛greater在这里 using namespace std; int main() { int t, n, a; cin >> t; while (t--){ priority_queue < int, vector<int>, greater<int> > q; cin >> n; for (int i = 0; i < n; i++){ cin >> a; q.push(a); } int sum = 0; while (!q.empty()){ int b = q.top(); q.pop(); if (q.empty()){ break; } else{ int c = q.top(); q.pop(); sum = sum + b + c;//合并 q.push(b + c);//attention!每次合并的代价 } } cout << sum << endl; } return 0; }
优先队列格式注意一下0.0