其他分享
首页 > 其他分享> > AcWing148 合并果子(哈夫曼贪心、优先队列)

AcWing148 合并果子(哈夫曼贪心、优先队列)

作者:互联网

题目:AcWing148 合并果子

题解目录


前言

哈夫曼编码的结果是让各个使用频率不同的字符编码长度最小。合并果子这道题目可以合并非相邻的果子,自然是使用哈夫曼贪心。

一、题目陈述

假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。
输入格式
输入包括两行,第一行是一个整数n,表示果子的种类数。
第二行包含n个整数,用空格分隔,第i个整数ai是第i种果子的数目。
输出格式
输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。
数据范围
1≤n≤10000,
1≤ai≤20000
输入样例
3
1 2 9
输出样例
15

二、解决思路

使用优先队列,每次都合并最小的两堆果子。因为合并果子不需要两堆果子必须相邻,所以是哈夫曼贪心。如果是要求必须相邻,就要考虑DP算法了。

三、代码实现

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int main() {
	int n;	cin>>n;
	priority_queue<int, vector<int>, greater<int>> heap;
	while(n --) {
		int x;	cin>>x;
		heap.push(x);
	}
	int res = 0;
	while(heap.size()>1) {
		int a=heap.top();	heap.pop();
		int b=heap.top();	heap.pop();
		res += a + b;
		heap.push(a+b);
	}
	cout<<res<<endl;
	return 0;
}

总结

使用了优先队列,每次合并最小的两堆果子。

标签:include,哈夫曼,果子,int,合并,heap,AcWing148,贪心
来源: https://blog.csdn.net/weixin_43681549/article/details/113806273