[NOI2015]荷马史诗
推荐一篇题解
(感觉自己讲不清楚所以不如直接粘题解)
观察之后发现这就是哈夫曼编码,于是按照编码方式构造即可。
#include <bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
struct node{
ll w,h;
node(){w=0,h=0;}
node(ll w,ll h):w(w),h(h) {}
bool operator <(const node &a)const {return a.w==w?h>a.h:w>a.w;}
};
ll ans,maxh;
int n,k,x,cnt;
priority_queue<node> q;
inline int read(){
int cnt=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){cnt=(cnt<<1)+(cnt<<3)+(c^48);c=getchar();}
return cnt*f;
}
signed main(){
n=read(),k=read();
for(int i=1;i<=n;++i) {x=read(),q.push(node(x,1));}
if((n-1)%(k-1)) cnt=k-1-((n-1)%(k-1));
for(int i=1;i<=cnt;++i) q.push(node(0,1));
cnt+=n;
while(cnt>1){
x=maxh=0;
for(int i=1;i<=k;++i){
x+=q.top().w;
maxh=max(maxh,q.top().h);
q.pop();
}
ans+=x;
q.push(node(x,maxh+1));
cnt-=k-1;
}
cout<<ans<<endl<<q.top().h-1<<endl;
return 0;
}