【贪心】哈夫曼变形题——最优组合问题

算法设计与分析练习题 第一章 下列关于算法的说法中正确的有( )。 Ⅰ.求解某一类问题的算法是唯一的 Ⅱ.算法必须在有限步操作之后停止 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 Ⅳ.算法执行后一定产生确定的结果 A. 1 个 B.2 个 C.3 个 D.4 个 T(n)表示当输入规模为 n 时的算法效率,以下算法效率最优的是( )。 A.T(n)= T(n-1)+1,T(1)=1 B.T(n)= 2n2 C.T(n)= T(n/2)+1,T(1)=1 D.T(n)=3nlog2n 什么是算法?算法有哪些特征? 证 阅读详情

1.问题描述

在这里插入图片描述

2.算法思路

首先认识优先队列:

优先队列的本质是堆,但它具有队列的所有操作,比如push(),pop(),top(),empty()…;它与普通队列不同的是它会自动按照优先级顺序排序,相当于在队列的基础上加了个堆排序

头文件:<queue>、<functional>

大顶堆(降序)定义 默认

priority_queue<int> big_heap;

小顶堆(升序)定义 需要加参数

priority_queue<int,vector<int>,greater<int> > small_heap;

回到本题

此题和构建哈夫曼树的过程异曲同工,需要借助优先队列来解决

求最多比较次数,则用大顶堆,弹出队列前两个,相加(合并)后再入队,并计算合并这两个序列的比较次数

求最少比较次数,则用小顶堆,后面同理

3.程序代码

#include<bits/stdc++.h>
using namespace std;
#define N 100100
int k;
int a[N];
priority_queue<int> big_heap;
priority_queue<int,vector<int>,greater<int> > small_heap;
int main(){
	scanf("%d",&k);
	for(int i=1;i<=k;i++) {
		scanf("%d",&a[i]);
		big_heap.push(a[i]);
		small_heap.push(a[i]);
	}
	int max=0,min=0;
	for(int i=1;i<k;i++){
		int x=big_heap.top();
		big_heap.pop();
		int y=big_heap.top();
		big_heap.pop();
		int new1=x+y;
		big_heap.push(new1);
		max=max+x+y-1;
	}
	for(int i=1;i<k;i++){
		int m=small_heap.top();
		small_heap.pop();
		int n=small_heap.top();
		small_heap.pop();
		int new2=m+n;
		small_heap.push(new2);
		min=min+m+n-1; 
	}
	printf("%d %d",max,min);
	return 0;
}

4.测试

在这里插入图片描述

蓝桥杯真题高效刷题指南:构建算法知识体系与实战流水线 算法学习与竞赛准备中,系统化地刷题是提升编程能力的核心路径。其原理在于通过刻意练习,将离散的知识点连接成网络,从而内化解题思维。对于技术价值而言,这不仅是为了通过单次考试,更是为了培养结构化的问题分解能力和工程化的代码实现习惯。在应用场景上,无论是准备蓝桥杯等算法竞赛,还是应对技术面试中的编程环节,一套高效的刷题方法都至关重要。本文聚焦于如何将每一道蓝桥杯真题的价值最大化,通过建立包含预处理、攻坚、实现与复盘的个人刷题流水线,帮助学习者避免无效刷题,并自然融入对动态规划和深度优先搜索等高频考点的深入理解,最 阅读详情

相关推荐

多算法组合与模型最优

多算法组合与模型最优:模型状态分析、线性模型的权重分析、Bad-case分析、模型融合

组合最优化算法(一)

黄金分割法、斐波那契法、进退法、二分法、抛物线黄金分割法斐波那契法进退法二分法抛物线法合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...

lilian的博客 7646

基于遗传算法的二维排样优化方法 (2001年)

遗传算法是一种全局最优化的数值优化方法,由于搜索过程不依赖梯度信息、不易陷入局部最优解,它适合解决各类优化问题,尤其是复杂的非线性问题。二维排样是典型的组合优化问题,应用遗传算法,建立了排样优化问题的数学模型,提出了解决这一问题的有效算法,开发了实用的排样软件,并给出了计算实例。

组合最优化

最优化问题 ​ 最优化问题涉及的应用领域很广,问题的种类与性质繁多,归纳起来,可分为函数优化问题和组合优化问题两大类。其中函数最优化问题的解是一定区域内连续取值的量,而组合优化问题的解则是离散取值的量。 线性规划问题 ​ 首先要确定一组具有明确含义的变量,称之为决策变量。问题的目标是选取这些决策变量的值使得一个函数取得最大值和最小值,此函数称之为目标函数。并且利用决策变量把问题的条件表示成等式或不等式,并称这些等式或不等式为约束条件。如果目标函数是决策变量的线性函数,

shuangmu_chenglin的博客 4958

组合最优化算法和复杂性

本书是普林斯顿大学的教材,介绍了很多经典的最优化算法,不是新书,但很经典

Python | 集合(set)运算之intersection()

简介 在做力扣题的时候,有一个思路是要求解两个字符串的交集。 一般来说,求解交集的思路是遍历两个字符串,判断有无相等,有相等则添加到交集中,直到循环结束。 但是这样做,会增加很多的不必要的遍历:比如说,当一个字符串中有多个相同的元素时,该元素会被遍历多次。 因此,在求解时,我们可以先将字符串转换为set集合类型。集合中存储的元素没有顺序,且互异(即元素不可重复)。 算例 求字符串m“abcdaaa” 与 字符串n“bcddses”是否存在交集 首先将字符串转换为set类型: m = set(m) n

lovetaozibaby的博客 1万+

组合最优化——期末总结

这次,我绝对不会再做预测了,绝不可能被打脸 一、基本概念: 1、组合最优化:又称为离散最优化通过对数学方法的研究去寻找离散事件的最优编排、分组、次序或筛选等。可用数学模型表述为: min f(x) s.t. g(x)≥0, x ∈ D 2、组合最优化问题:在给定有限集合的所有具备某些特性的子集族中,寻找使某种指标达到最优的子集的问题。 3、组合最优化问题的目标通常是从组合问题的可行解集中求出最优解...

君陌的博客 7560

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5516

数字的最优组合算法

关于数字的最优组合的算法,记得上学时数学考试还有过这么一道题目~ 比如:顾客去商店买东西,前台结账时应付总额为31元,顾客拿出一张百元大钞,此时店员应找69元,求最优的找钱方案。 找钱的方案可以为:6*10元+5元+4*1元 或者 50元+10元+5元+2元+2元等等,此算法可以直接获取最优结果。   /** * @brief 最优找钱方案 * @author chendeshan

程序员 4870

用ESP32-S3和USB摄像头DIY一个无线图传监控(附完整代码和接线图)

本文详细介绍了如何利用ESP32-S3开发板和USB摄像头打造一套高性价比的无线图传监控系统。从硬件选型、接线图到代码实现,提供了完整的DIY方案,特别适合家庭监控、宠物看护等场景。通过优化WiFi传输和双核任务分配,实现了稳定的视频流传输,整套方案成本控制在200元以内。

weixin_33701251的博客 519

PyCharm启动报错急救指南:3步定位.vmoptions文件位置(Win/Mac路径详解)

本文针对PyCharm启动失败问题,提供了一份详细的急救指南。核心在于精准定位并修复关键的.vmoptions配置文件。文章通过三步法详解了在Windows和macOS系统上查找该文件的具体路径,并分析了因新旧版本冲突、破解补丁残留或参数设置错误导致启动失败的常见场景及解决办法,帮助开发者快速恢复IDE的正常工作。

weixin_28835789的博客 702

石子合并问题 -- 任意版

有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为将的一堆石子的数量。设计一个算法,将这N堆石子合并成一堆的总花费最小(或最大)。 此类问题比较简单,就是哈夫曼编码的变形,用贪心算法即可求得最优解。即每次选两堆最少的,合并成新的一堆,直到只剩一堆为止。证明过程可以参考哈夫曼的证明过程。        代码如下: #include #includ

天堂人间 2595

OpenPnP/Arduino - 二手西门子电动飞达的通讯协议解析与实战

本文详细解析了二手西门子电动飞达的通讯协议,并通过Arduino控制板实现与开源贴片平台OpenPnP的集成。文章涵盖了硬件接口定义、协议帧结构分析、Arduino控制实战、OpenPnP集成技巧以及二手飞达翻新指南,为开发者提供了全面的技术指导和实战经验。

weixin_30411819的博客 202

石子合并问题

石子合并问题是最经典的DP问题。首先它有如下3种题型: (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并成一堆的总花费最小(或最大)。 分析:当然这种情况是最简单的情况,合并的是任意两堆,直接贪心即可,每次选择最小的两堆合并。本问题实际上就是哈夫曼的变形。 (2)有N堆

ACdreamer 5万+

ZYNQ工业级串口方案:AXI UART 16550扩展RS-485实战(自动方向控制+Linux驱动)

可以轻松扩展出多路工业级串口。但常规方案需要手动控制收发方向(DE/RE引脚),存在实时性差、CPU占用高等痛点。本文从硬件逻辑设计到Linux驱动开发,完整实现了ZYNQ平台的RS-485工业通信方案。,解决了传统方案实时性差的痛点。所有代码均经过实际项目验证,可直接用于生产环境。:尝试将此设计扩展为多协议兼容接口(支持RS-422/RS-232切换)!等特性,依然是现场总线通信的首选。,通过硬件逻辑+Linux驱动协同设计,实现零延迟切换。在工业自动化、能源电力等场景中,RS-485凭借。

QQ_778132974的博客 830

软件设计师高频考点—套路题

学习交流的总结

秩沅 2539

贪心算法在考研机试中的核心应用与解题技巧

贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法思想,其核心原理是通过局部最优解逐步构建全局最优解。这种算法在解决最优化问题时具有高效性,特别适用于具有贪心选择性质和最优子结构的问题。在工程实践中,贪心算法常用于任务调度、区间问题、哈夫曼编码等场景。考研机试中,贪心算法是高频考点,尤其是区间问题和任务调度类题目。掌握贪心算法的解题框架和证明方法,能够有效提升解题效率。本文结合ACM竞赛和考研机试的实战经验,深入剖析贪心算法的应用技巧和常见陷阱。

weixin_30231327的博客 319

流体动力学仿真软件:CFX_(10).案例实践:复杂流场分析

在“Phases”选项卡中,定义参与仿真的不同相。例如,如果您要分析气液两相流,可以定义“Air”和“Water”两个相。

kkchenjj的博客 1689

贪心算法实战指南:从决策逻辑到生产级Python实现

贪心算法是一种基于局部最优选择构造全局解的经典算法范式,其核心在于贪心选择性质与最优子结构两大数学前提。理解它不仅是掌握‘活动选择’‘找零钱’等典型问题的关键,更是构建高响应、低延迟业务系统(如会议室调度、实时广告竞价、物流派单)的底层决策逻辑。本文结合电商库存分配、SaaS资源配额、智能排程等真实场景,解析贪心成立的必要条件、与动态规划的本质分界,并提供可直接部署的Python工程代码与边界测试方法,帮助开发者规避‘直觉贪心’陷阱,实现从理论认知到落地交付的跨越。

windshg的专栏 487

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

算法设计与分析期末模拟卷:分治、动态规划与贪心算法实战精讲

算法设计与分析是计算机科学的核心基础,其核心思想如分治法、动态规划和贪心算法,为解决复杂计算问题提供了系统性的框架。分治法通过“分而治之”将大问题分解为子问题,动态规划利用最优子结构和重叠子问题特性高效求解,而贪心算法则通过局部最优选择寻求全局较优解。这些思想在搜索引擎优化、大数据处理、机器学习模型压缩等场景中具有极高的技术价值。例如,动态规划是解决序列比对、路径规划等问题的关键技术,而贪心算法则广泛应用于任务调度和霍夫曼编码等场景。本文以一份精心设计的算法期末模拟卷为载体,深入剖析了“分治法”在解决最大子

weixin_33834910的博客 362

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

蓝桥杯国赛真题深度复盘:动态规划与搜索剪枝实战解析

动态规划与深度优先搜索是算法竞赛中的核心解题技术。动态规划通过定义状态与转移方程,将复杂问题分解为重叠子问题求解,关键在于状态设计和优化,如使用滚动数组降低空间复杂度。深度优先搜索则通过系统枚举与剪枝策略,在解空间中进行高效探索,常用可行性剪枝与记忆化搜索提升效率。这些技术对于解决最优化、路径规划及组合类问题具有重要价值,广泛应用于资源调度、游戏AI等场景。本文以蓝桥杯国赛真题为例,结合动态规划与搜索剪枝,深入剖析如何将算法原理转化为AC代码,并分享竞赛中的实战调试与时间管理经验。

weixin_33979203的博客 372

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝桥杯国赛C++真题深度解析:从能力地图到高效备赛策略

在算法竞赛和编程学习中,深入理解核心算法思想与数据结构是构建扎实计算思维的基础。动态规划(DP)通过状态定义与转移方程解决最优化问题,而深度优先搜索(DFS)及其剪枝技术则是解决组合与路径问题的关键。这些技术的价值在于能将复杂问题高效抽象与求解,广泛应用于资源调度、路径规划及游戏AI等场景。本文以蓝桥杯国赛真题为切入点,系统拆解了其对STL应用、贪心算法、图论建模及数学思维的立体考察,并提供了从真题分析到专题强化的逆向备赛法,旨在帮助选手将解题能力升维为系统的工程实践能力。

weixin_31710909的博客 198

蓝桥杯国赛Python进阶:数据结构与算法核心能力提升指南

在算法竞赛与工程实践中,数据结构与算法是构建高效程序的基石。其核心原理在于通过合理组织数据与设计计算步骤,以最优的时空复杂度解决特定问题。掌握它们的技术价值在于能显著提升代码性能,解决大规模数据处理、实时系统、搜索引擎、推荐算法等复杂场景下的性能瓶颈。例如,哈希表(字典/集合)可实现O(1)的快速查找,堆能高效维护动态极值,而动态规划通过状态转移避免重复计算,是优化重叠子问题的关键。这些技术广泛应用于网络路由、数据库索引、人工智能决策等场景。本文聚焦蓝桥杯国赛Python高级考点,深入剖析数据结构选择优化与

weixin_33851429的博客 417

算法设计与分析核心知识点总结

与分治法不同,动态规划采用自底向上的填表法,典型应用有矩阵连乘、最长公共子序列问题。O(n)表示上界,Ω(n)表示下界,Θ(n)表示紧确界。通过m[i][j]记录最优计算代价,s[i][j]记录分割点。对于3个矩阵{10×100,100×5,5×50},按((AB)C)顺序需7500次乘法。与动态规划不同,贪心法不回溯且局部最优即全局最优,但不保证所有问题都能求解。空间优化可降维至O(min(m,n)),回溯dp数组可构造具体解。快速排序最坏O(n²)当数组有序时出现,随机化版本期望O(nlogn)。

BlackironFalcon78的博客 271

从蓝桥杯真题解析到算法竞赛实战:高效刷题与深度学习方法论

算法是计算机科学的核心基础,其本质是通过一系列指令高效解决特定问题的计算模型。理解算法原理,如动态规划的最优子结构和贪心算法的局部最优选择,是构建高效程序的关键。掌握这些核心算法能显著提升代码性能,解决大规模数据处理、路径规划等复杂工程问题。在信息学竞赛和日常开发中,算法能力直接决定了问题解决的效率与优雅度。本文以一道典型的竞赛真题(如涉及博弈论或动态规划的题目)为切入点,系统阐述从审题建模、算法选型到代码实现与调试的完整方法论。文中融入了对**动态规划**和**二分查找**等经典算法模板的深度剖析,并分享

weixin_34200628的博客 488

常用算法代码模板与题单 | A - 基础算法(更新于2026.10.7)

这篇文档其实是我自己学习路上的一份“复习笔记”。之前看了不少教程,零零散散记了一堆代码片段和小技巧,时间久了就容易忘,翻起来也麻烦。所以干脆花时间整理了一下,把常用的模板、容易踩的坑、还有一些个人觉得挺实用的小技巧都归到了一起。 如果你也在学类似的东西,或许能帮你省下一些翻找的时间;如果有哪里写得不清楚或不对,也欢迎随时指正交流。 希望这份整理也能对你有一点点帮助~ ✨

团爸讲算法 804
上一篇: 【贪心】会场安排问题
下一篇: 【CCF CSP】动态规划解——202209-2何以包邮?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值