Hafuman树多用于合并代价,以及模拟哈夫曼编码。
构造哈夫曼树可以用优先队列和数组来实现。
149. 荷马史诗
时间复杂度O(nlogn)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define se second
#define fi first
typedef long long ll;
#define mp make_pair
typedef pair<ll,int>PII;
priority_queue<PII,vector<PII>,greater<PII> >p;
int main()
{
int n,k;scanf("%d%d",&n,&k);
for(int i = 1; i <= n ; i++){
ll x;scanf("%lld",&x);
p.push(mp(x,0));
}
while((n-1)%(k-1)){
p.push(mp(0ll,0));n++;
}
ll ans=0;
while(p.size()>1){
ll sum=0;int dep=0;
for(int i = 0 ; i < k ; i++){
PII x=p.top();p.pop();
dep=max(x.se,dep);
sum+=x.fi;
}
ans+=sum;p.push(mp(sum,dep+1));
}printf("%lld\n%lld\n",ans,p.top().se);
return 0;
}
时间复杂度O(N)
const int maxn = 1e5+10;
int a[maxn],b[maxn];
int solve(){
int ai=0,bi=0,blen=0,cost=0;
bool f=true;
while(n-ai+blen-bi>1){
int num=0;
if(f){
if((N-k)%(k-1) == 0)
num=k;
else
num=(N-k)%(k-1)+1;
f=false;
}
else num=k;
int sum=0;
while(num--){
if(ai==n){
sum+=b[bi];
bi++;
}
else if(bi == blen){
sum += a[ai];
ai++;
}
else if(a[ai]<b[bi]){
sum+=a[ai];
ai++;
}
else{
sum+=b[bi];
bi++;
}
}
cost += sum;
b[blen++]=sum;
}
return cost;
}
int main()
{
scanf("%d",&n);
for(int i = 0 ; i < n ; i++){
scanf("%d",&a[i]);
}sort(a,a+n);
int sum = solve();
return 0;
}