贪心: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;
}
相关推荐
哭泣方源炼蛊12 小时前
正则表达式c++内容汇集
数据库·c++·mysql·正则表达式
索尔~古德曼13 小时前
CF(1400-1400&1300-1500)错题集
算法
别动我齐刘海13 小时前
简历技术栈全面复习——UDP / TCP / CAN / ZMQ / Protobuf 通信工程
网络·c++·python·tcp/ip·机器学习·udp·github
All for pursuit.14 小时前
【二分查找-2】34.在排序数组中查找元素的第一个和最后一个位置
数据结构·c++·算法·leetcode
泯泷14 小时前
为什么 AI 会"失忆"?——读懂 Agent 的记忆系统(一)
人工智能·算法·agent
大侠归来14 小时前
C语言与C++在基础语法上的区别
java·c语言·c++
看看我呀看看我14 小时前
基于Qt的虚拟键盘
c++·qt·qt5·qt6.3
bro_Java66614 小时前
链表进阶2:双向链表的构建
java·数据结构·链表
cu14315 小时前
细谈GM8229的具体功能与其应用
c语言·c++·人工智能·单片机
需要82615 小时前
分布式 ID 生成:雪花算法、号段模式与时钟回拨
分布式·算法