作业介绍

哈夫曼编码

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main(){
	int n ; 
	cin >> n;
	//创建一个 小根堆 优先队列,自动把最小的数放在最前面
	priority_queue<int,vector<int> , greater<int>> min_heap;
	//读入所有叶子节点的值
	for(int i = 0 ; i < n ; i++){
		int weight;
		cin >> weight;
		min_heap.push(weight);//把权值加入小根堆 
	}
	int total = 0 ; //用于存储带权路径长度总和
	//当堆中还有至少两个元素时,继续合并
	while(min_heap.size() > 1){
		//取最小的两个数
		int a = min_heap.top();min_heap.pop();
		int b = min_heap.top();min_heap.pop();
		//计算他们的和
		int sum = a + b ;
		//把和加入总和
		total += sum; 
		//把新生成的节点放回堆中
		min_heap.push(sum); 
	}	 
	cout << total << endl;
	return 0;
}
状态
已结束
题目
5
开始时间
2025-6-8 0:00
截止时间
2025-6-16 23:59
可延期
24 小时