#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;
typedef pair<LL,int>PLI;//权值和路径;
int main()
{
int n,k;
cin>>n>>k;
priority_queue<PLI,vector<PLI>,greater<PLI>>heap;//这里是双数据排序可以取得更小的高度
for(int i=0;i<n;i++)
{
LL x;
cin>>x;
heap.push({x,0});
}
//n-m(k-1)=1等价转换而来,最后一层的叶子是k个所以=1;其他是由两个组合成一个的
while((n-1)%(k-1))heap.push({0,0}),n++;
//K个一组进行合并
LL res=0;
while(heap.size()>1)
{
LL s=0;
int depth=0;
for(int i=0;i<k;i++)
{
auto t=heap.top();
s+=t.first;
depth=max(depth,t.second);
heap.pop();
}
heap.push({s,depth+1});
res+=s;
}
cout<<res<<endl;
cout<<heap.top().second;//堆顶到叶子路径长度
return 0;
}
ACwing 149. 荷马史诗
最新推荐文章于 2024-06-06 09:02:43 发布