有n堆石子,每次取出两堆合成一堆,每堆石子的个数即为合并石子所需要耗费的体力,求出合并所有石子堆所需要耗费的最小体力
有n堆石子,每次取出两堆合成一堆,每堆石子的个数即为合并石子所需要耗费的体力,求出合并所有石子堆所需要耗费的最小体力
典型的贪心题,即每次取出数量最少的两堆石子合并.
举个例子来说,假如有5堆石子,石子个数分别为
1 2 3 4 5
为了使得耗费的体力最小,我们需要每次合并石子数最小的和次小的两堆石子
第一次
1 + 2 ,耗费3点体力
石子堆变为
3 3 4 5
第二次
3 + 3 ,耗费6 点体力
石子堆变为
6 4 5
第三次
4 + 5 ,耗费9点体力
石子堆变为
6 9
最后一次
6 + 9 ,耗费15点体力
此时石子已经完成合并,变为一堆
所以耗费的最小体力为
3 + 6 + 9 + 15 = 33点体力
将其转换为编程思路
可以利用C++中的 multiset 容器(对插入的数据进行自动排序,这样我们可以每次取前两个数据,也就是最少的两堆石子),考虑到合并石子之后石子的个数可能会和原有石子堆的个数相同,而set容器会自动去重,所以用 multiset
完整代码如下:
#include <iostream>
#include <set>using namespace std;int main()
{int n;cin >> n; //石子的堆数multiset<int> data; //合并石子后石子个数可能会和原有的某堆石子个数相同,所有选择 multiset(set会自动去重)multiset<int>::iterator is;int tmp;int sum = 0;for (int i = 0; i < n; ++i){cin >> tmp; //输入每堆石子的个数data.insert(tmp);}while (data.size() > 1){tmp = 0;is = data.begin();tmp += *is;data.erase(is);is = data.begin();tmp += *is;data.erase(is);data.insert(tmp);sum += tmp;}cout << sum << endl;system("pause");return 0;
}
有n堆石子,每次取出两堆合成一堆,每堆石子的个数即为合并石子所需要耗费的体力,求出合并所有石子堆所需要耗费的最小体力相关推荐
- 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...
- 面试题:一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组
面试题:一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组 思路如下:由题意可知存在两种操作,1.摸牌:2 ...
- 有一堆棋子,两枚两枚的数,最后余1枚,3枚3枚的数,最后余2枚,5枚5枚的数,最后余4枚,6枚6枚的数,最后余5枚,只有7枚7枚的数,正好可以数完。编程求出这堆棋子最少有多少枚棋子?
有一堆棋子,两枚两枚的数,最后余1枚,3枚3枚的数,最后余2枚,5枚5枚的数,最后余4枚,6枚6枚的数,最后余5枚,只有7枚7枚的数,正好可以数完.编程求出这堆棋子最少有多少枚棋子? # includ ...
- 一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组
题目:一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手上没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组.(题目来源于一篇知乎上的文章) 思路: 在原牌堆 ...
- LeetCode 1631. 最小体力消耗路径(DFS + 二分查找)
文章目录 1. 题目 2. 解题 1. 题目 你准备参加一场远足活动.给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row ...
- leetcode 1631. 最小体力消耗路径(并查集)
你准备参加一场远足活动.给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度.一开始你在最左上角的格子 ...
- 【LeetCode】1631. Path With Minimum Effort 最小体力消耗路径(Medium)(JAVA)每日一题
[LeetCode]1631. Path With Minimum Effort 最小体力消耗路径(Medium)(JAVA) 题目描述: You are a hiker preparing for ...
- 1-9九个数字组成一个九位数 如果从左边起取出1个数字,需要能被1整除,取出两个数字组成的数能被2整除,取出三个数字组成的数能被3整除,依次类推
1-9九个数字组成一个九位数,数字没有重复.如果从左边起取出1个数字,需要能被1整除,取出两个数字组成的数能被2整除,取出三个数字组成的数能被3整除,依次类推...每次取数都是从左边取.问,这个数是什 ...
- 100个白球100个黑球,取出两个球,同色则补充黑色,异色则补充白色。最后剩什么颜色
[题目描述] 桶中取黑白球 有一个桶,里面有白球.黑球各100个,人们必须按照以下规则把球取出来: 1.每次从桶中那两个球 2.如果是两个同色的球,那就再放入一个黑球 3.如果是两个异色的球,那就再放 ...
最新文章
- js判断 IE 浏览器
- swift3.0 渐变色
- 浅析人类最贵、最大的机器学习模型GPT-3及背后隐含的商业逻辑
- HCIE-OSPFV3
- 下一代云计算?容器云和微服务时代的来临
- 算法设计与分析知识点整理
- VM14 安装黑苹果教程步骤
- css背景颜色设置为半透明,关于css设置背景色透明,半透明
- 3dMax导入unity 材质问题
- 关于Windows系统脚本(jscript)
- 视频呼叫可视对讲门铃高清双向呼叫视频对讲屏
- SpringMVC学习----请求与响应
- npm 脚本跨平台设置环境变量命令 cross-env
- JZOJ5454. 【NOIP2017提高A组冲刺11.5】仔细的检查 树hash
- ThinkPHP文件包含漏洞分析
- Android 破解APK
- 《Python数据科学入门》之阅读笔记(第2章)
- PLSQL 解析XML示例2
- java实现2048小游戏(源码+注释)
- Linux源码的目录结构和Linux文件系统的目录结构
热门文章
- 美版有锁iphone 如何上电信3G
- Snagit_日文输入法:促音,长音,小写的输入方法
- 作业1 OO基础1-3、 设计一个教师类Teacher(属于cn.net.sdkd包)
- Excel单元格中怎么批量将两行合并成一行
- 自学前端开发,现在手握大厂offer,我的故事还在继续
- 增值电信业务经营许可证办理续期流程
- 个人卖云服务器需要什么证,云服务器个人使用能做什么 云服务器要不要个人认证...
- cmd查看端口占用,结束进程
- 上海计算机在职研究生学校排名,上海在职研究生考研周末班十大排名
- 安徽计算机在职研究生学校,安徽在职研究生招生学校2020