题目给出的定义显然就是让我们求Huffman编码。
不过可能是K叉的,我们加几个0补全就好了。
为了满足第二个要求,贪心的权值相同时深度小的优先。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
#define pi pair<ll,int>
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline ll read(){
ll x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int n,K;
ll ans=0;
priority_queue<pi,vector<pi>,greater<pi> >q;
int main(){
// freopen("a.in","r",stdin);
n=read();K=read();
for(int i=1;i<=n;++i) q.push(make_pair(read(),0));
if((n-1)%(K-1)){
int tmp=(n-1)%(K-1)+1,dep=0;ll res=0;
while(tmp--){
res+=q.top().first,dep=max(dep,q.top().second+1);q.pop();
}ans+=res;q.push(make_pair(res,dep));
}int tmp=(n-1)/(K-1);
while(tmp--){
ll res=0;int dep=0;
for(int i=1;i<=K;++i){
res+=q.top().first,dep=max(dep,q.top().second+1);q.pop();
}ans+=res;q.push(make_pair(res,dep));
}printf("%lld\n%d\n",ans,q.top().second);
return 0;
}