#include <iostream> #include <queue> #include <vector> using namespace std; int main() { int n; cin >> n; vector<long long> freq(n); // 使用 long long 防止大数溢出 for (int i = 0; i < n; ++i) { cin >> freq[i]; } // 使用优先队列(最小堆) priority_queue<long long, vector<long long>, greater<long long>> minHeap; for (long long num : freq) { minHeap.push(num); } long long totalLength = 0; // 合并直到只剩一个节点 while (minHeap.size() > 1) { long long first = minHeap.top(); minHeap.pop(); long long second = minHeap.top(); minHeap.pop(); long long merged = first + second; totalLength += merged; // 累加合并后的权重 minHeap.push(merged); } cout << totalLength << endl; return 0; }
c++中priority_queue容器提供了大小顶堆的数据结构,通过greater或者less<T>来指定大顶还是小顶,依次出栈2个元素构造哈夫曼节点,从而计算权重