贪心:Huffman树

合并果子:

该题与石子合并的区别:石子合并是两两相邻才能合并,这题是任意两点合并

该题的思路:每次合并最小的两个点

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

int main()
{
    int n;
    scanf("%d", &n);

    priority_queue<int, vector<int>, greater<int>> heap;//小根堆,所以堆头是最小值
    while (n -- )
    {
        int x;
        scanf("%d", &x);
        heap.push(x);
    }

    int res = 0;//答案
    while (heap.size() > 1)//只要超过两个数,就两个合并。因为是小根堆,每次合并的都是最小的两个
    {
        int a = heap.top(); heap.pop();
        int b = heap.top(); heap.pop();
        res += a + b;
        heap.push(a + b);
    }

    printf("%d\n", res);
    return 0;
}
相关推荐
业精于勤的牙1 小时前
浅谈:算法中的斐波那契数(二)
算法·职场和发展
不穿格子的程序员1 小时前
从零开始写算法——链表篇4:删除链表的倒数第 N 个结点 + 两两交换链表中的节点
数据结构·算法·链表
liuyao_xianhui1 小时前
寻找峰值--优选算法(二分查找法)
算法
dragoooon341 小时前
[hot100 NO.19~24]
数据结构·算法
神仙别闹2 小时前
基于QT(C++)实现学本科教务系统(URP系统)
数据库·c++·qt
deng-c-f2 小时前
Linux C/C++ 学习日记(49):线程池
c++·学习·线程池
电子硬件笔记2 小时前
Python语言编程导论第七章 数据结构
开发语言·数据结构·python
ulias2122 小时前
C++ 的容器适配器——从stack/queue看
开发语言·c++
daidaidaiyu3 小时前
FFmpeg 关键的结构体
c++·ffmpeg
Tony_yitao3 小时前
15.华为OD机考 - 执行任务赚积分
数据结构·算法·华为od·algorithm