当前位置: 代码迷 >> 综合 >> 堆:荷马史诗
  详细解决方案

堆:荷马史诗

热度:30   发布时间:2023-12-22 14:02:05.0

题目链接:https://www.acwing.com/problem/content/151/
题意:原题比较繁琐,总体意思和合并果子一样,只不过是每次最大合并k个而不是两个。
思路:最多合并k个不一定每次都能合并k个,那么我们让最小的几个先不满足k个合并,之后的合并都是k个结合,那么得到的结果回最小。
代码实现:

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>using namespace std;
typedef long long LL;
typedef pair<LL, int> PLI;const int N = 1e5 + 5;int main()
{
    int n, m;cin >> n >> m;priority_queue<PLI, vector<PLI>, greater<PLI>> heap;for (int i = 0; i < n; i ++ ){
    LL x;cin >> x;heap.push({
    x, 0});}//为了使每次都是合并k个数,就先push进一些0while ((n - 1) % (m - 1)){
    heap.push({
    0, 0});n ++ ;}LL res = 0;while (heap.size() > 1){
    LL sum = 0;//记录新节点的高度int depth = 0;for (int i = 0; i < m; i ++ ){
    sum += heap.top().first;depth = max(depth, heap.top().second);heap.pop();}res += sum;heap.push({
    sum, depth + 1});}cout << res << endl;cout << heap.top().second << endl;return 0;
}