构造最优前缀的贪心算法
问题:
构造最优前缀的贪心算法,即哈夫曼算法
解析:
我们可以用一个数据结构维护所有数字的最小两个值,每次取最小的两个值就是序列,把这两个值累加到结果上,那么结果就是WPL
设计:
priority_queue<int, vector<int>, greater<int> >q;
for(int i = 0; i < n; i++){
int x = rd();
q.push(x);
}
while(q.size() > 1){
int x = q.top();q.pop();
int y = q.top();q.pop();
save.push_back(x);
save.push_back(y);
res += x + y;
q.push(x + y);
}
代码:
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
int x;
scanf("%d", &x);
return x;
}
int res = 0;
vector<int>save;
int main(){
int n = rd();
// 利用小顶堆维护一个栈顶都是当前最小值的数据结构
priority_queue<int, vector<int>, greater<int> >q;
for(int i = 0; i < n; i++){
int x = rd();
q.push(x);
}
while(q.size() > 1){
int x = q.top();q.pop();
int y = q.top();q.pop();
save.push_back(x);
save.push_back(y);
res += x + y;
q.push(x + y);
}
printf("WPL = %d\n", res);
for(int i = 0; i < save.size(); i++)
printf("%d ", save[i]);
printf("\n");
system("pause");
return 0;
}
分析:
O(nlogn)
github源码地址:
传送门