用c++语言完成以下题目:蒜头君要进行小屋装修改造,现在他有 n 块木料,第 i 块木料的高度为 2^{ai} ​ 。蒜头君可以对木料进行若干次操作,直到无法操作为止: 选择两块相邻且高度相同的木料,将两块木料钉到一起,形成一块儿更高的木料,高度为两块木料的高度之和。 现在蒜头君想要知道:他最少可能进行多少次操作。

时间: 2023-05-25 14:06:59 浏览: 31
思路:贪心+优先队列 首先考虑贪心思想,如果两块相邻且高度相同的木料不相邻,肯定不是最优的选择。因此,我们可以想到使用贪心算法,每次找到最长的相同高度的木料连成一块,然后合并。 但是,这个合并的过程可能会影响到其他的木料,因此需要重新运用贪心的思想,选择最小的影响,然后再合并。 为了方便找到最长的相同高度的木料,我们可以使用一个优先队列,将所有木料的高度放入其中,每次取出前两个相等的,合并它们,并将新的高度放回队列中。 具体实现如下:
相关问题

用c++语言完成以下题目:蒜头君要进行小屋装修改造,现在他有 n 块木料,第 i 块木料的高度为 2^{ai} ​ 。蒜头君可以对木料进行若干次操作,直到无法操作为止: 选择两块相邻且高度相同的木料,将两块木料钉到一起,形成一块儿更高的木料,高度为两块木料的高度之和。 现在蒜头君想要知道:他最少可能进行多少次操作。

思路: 我们可以用 greedy 的思路,每次将相邻两块高度最近似的木料合并,从而减少操作次数。 具体方法是将所有木料按高度从小到大排好序,并将原始高度转换为对数形式。即对于第 i 块木料,将其高度 a[i] 转换为 log2(a[i])。 然后我们从小到大遍历木料,每次找出相邻的两块木料中高度最近似的两个并合并。 我们可以用堆来维护每次遍历到某一块木料时,高度最近似的两块木料。具体来说,对于第 i 块木料,我们从堆中弹出最小的那个数,即它的左侧或右侧的高度最近似的木料,然后与第 i 块木料合并。 由于每个木料只会被合并一次,因此操作次数不会超过 n。 代码实现: 本题是一道比较模板化的贪心题,代码实现相对简单。

用c++语言的代码完成以下题目:蒜头君要进行小屋装修改造,现在他有 n 块木料,第 i 块木料的高度为 2^{ai} ​ 。蒜头君可以对木料进行若干次操作,直到无法操作为止: 选择两块相邻且高度相同的木料,将两块木料钉到一起,形成一块儿更高的木料,高度为两块木料的高度之和。 现在蒜头君想要知道:他最少可能进行多少次操作。

思路:由于两块高度相同的木料才可以进行操作,所以我们要找到所有相同高度的木料并进行聚合,直到最终只剩下一块木料为止。因此,我们可以使用一个 map 来记录每种高度的木料的数量,然后从小到大不断找相邻两个高度相同的木料进行聚合,直到只剩下一块木料为止。 代码实现: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <stdbool.h> #include <string.h> #define MAXN 100000 int n, a[MAXN + 5]; int cnt[MAXN * 2 + 5]; int main() { scanf("%d", &n); for (int i = 1;i <= n;i++) { scanf("%d", &a[i]); cnt[a[i]]++; } int ans = 0; bool flag = true; while (flag) { flag = false; for (int i = 0;i <= 20;i++) { if (cnt[i] >= 2) { int t = cnt[i] / 2; cnt[i + 1] += t; cnt[i] -= t * 2; ans += t; flag = true; } } } printf("%d\n", ans); return 0; }

相关推荐

最新推荐

recommend-type

C++ 中boost::share_ptr智能指针的使用方法

主要介绍了C++ 中boost::share_ptr智能指针的使用方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
recommend-type

C/C++语言宏定义使用实例详解

主要介绍了 C/C++语言宏定义使用实例详解的相关资料,需要的朋友可以参考下
recommend-type

C++语言:switch语句最详细讲解.pdf

C++语言:switch语句最详细讲解。从switch语句的执行过程,switch语句的注意要点,例题讲解,作业等 。适合于中小学生,信息学爱好者。
recommend-type

第四届 蓝桥杯 竞赛试题题目 C/C++高职高专组

第四届“蓝桥杯”全国软件专业人才设计与创业大赛选拔赛 C/C++高职高专组 1、题目标题: 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加...
recommend-type

VS2019中CMake项目如何指定c++语言标准

主要介绍了VS2019中CMake项目如何指定c++语言标准,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。