第1条题解
2026-03-02 07:33:07
发布于:北京
0阅读
0回复
0点赞
非常简单
就是要构造一棵k叉哈夫曼树
由于最后可能凑不齐k个节点
所以在最开始补到k的倍数
接下来每轮合并k个,再push,并计算最大深度
最后一个和 和 一个深度(只剩一个点了)
#include<bits/stdc++.h>
using namespace std;
using pli = pair<long long, int>;
int main() {
int n,k;
cin>>n>>k;
priority_queue<pli, vector<pli>, greater<pli>> pq;
for (int i=0; i<n; i++) {
long long w;
cin>>w;
pq.push({w,0});
}
int need = (k-1-(n-1)%(k-1))%(k-1);
for (int i=0; i<need; i++) {
pq.push({0, 0});
}
long long t=0;
while (pq.size()>1) {
long long sum = 0;
int maxDepth = 0;
for (int i=0; i<k; i++) {
auto [w,d] = pq.top();
pq.pop();
sum += w;
maxDepth=max(maxDepth, d);
}
t+=sum;
pq.push({sum, maxDepth + 1});
}
cout <<t<<endl;
cout <<pq.top().second;
return 0;
}
点个赞
这里空空如也







有帮助,赞一个