运用了类似归并排序的思想
除了一开始给数组排序的O(nlogn)时间外,之后每次构造K叉树时间复杂度为O(n)
typedef long long ll;
const int N=1e5+10;
int a[N],b[N];
ll hafuman(int k,int len)
{
//sort(a,a+len);
int a0=0,b0=0,b1=0;
int num;
ll ans=0,sum;
if((len-1)%(k-1)!=0) //先构造多余的数,花费更少
{
num=(len-1)%(k-1)+1;
sum=0;
while(num--)
{
if(b0==b1||a[a0]<b[b0]&&a0<len) sum+=a[a0++];
else sum+=b[b0++];
}
b[b1++]=sum;
ans+=sum;
}
int t=(len-1)/(k-1);
while(t--)
{
num=k;
sum=0;
while(num--)
{
if(b0==b1||a[a0]<b[b0]&&a0<len) sum+=a[a0++];
else sum+=b[b0++];
}
b[b1++]=sum;
ans+=sum;
}
return ans;
}