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