#include <iostream> #include <queue> using namespace std; // 自定义比较函数,用于优先队列(最小堆) struct myCompare { bool operator()(const int& a, const int& b) { return a > b; } }; int main() { int n; while (cin >> n) { // 处理多组数据 priority_queue<int, vector<int>, myCompare> minHeap; // 最小堆 int weight; for (int i = 0; i < n; i++) { cin >> weight; minHeap.push(weight); // 将叶节点权值插入最小堆 } int totalCost = 0; // 总权值 while (minHeap.size() > 1) { // 取出两个最小的权值 int min1 = minHeap.top(); minHeap.pop(); int min2 = minHeap.top(); minHeap.pop(); // 合并两个节点,计算新节点的权值 int sum = min1 + min2; totalCost += sum; // 累加到总权值 minHeap.push(sum); // 将新节点插入最小堆 } cout << totalCost << endl; // 输出结果 } return 0; }