huffman编码
c++代码如下:
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i = x;i <= y; ++ i)
#define repd(i,x,y) for(register int i = x; i >= y; -- i)
typedef long long ll;
using namespace std;
template<typename T>inline void read(T&x)
{
char c;int sign = 1;x = 0;
do { c = getchar(); if(c == '-') sign = -1; }while(!isdigit(c));
do { x = x * 10 + c - '0'; c = getchar(); }while(isdigit(c));
x *= sign;
}
int n,k;
struct node
{
ll w,h;
node(ll W,ll H) { w = W;h = H; }
};
bool operator < (node a,node b) { return a.w > b.w || a.w == b.w && a.h > b.h; }
priority_queue<node>q;
int main()
{
read(n); read(k);
rep(i,1,n)
{
ll w ;
read(w);
q.push(node(w,1));
}
int cnt = (k - 1 - (n - 1)%(k - 1) )% (k - 1);
rep(i,1,cnt) q.push(node(0,1));
n += cnt; ll ans = 0,mxh,tmp;
while(n > 1)
{
mxh = tmp = 0;
cnt = k;
while(cnt -- )
{
ans += q.top().w;
tmp += q.top().w;
mxh = max(mxh,q.top().h);
q.pop();
}
q.push(node(tmp,mxh+1));
n -= k -1;
}
printf("%lld\n%lld\n",ans,q.top().h-1);
return 0;
}