有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堆石子,每次取出两堆合成一堆,每堆石子的个数即为合并石子所需要耗费的体力,求出合并所有石子堆所需要耗费的最小体力相关推荐

  1. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子

    问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...

  2. 面试题:一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组

    面试题:一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组 思路如下:由题意可知存在两种操作,1.摸牌:2 ...

  3. 有一堆棋子,两枚两枚的数,最后余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 ...

  4. 一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手中没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组

    题目:一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手上没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组.(题目来源于一篇知乎上的文章) 思路: 在原牌堆 ...

  5. LeetCode 1631. 最小体力消耗路径(DFS + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 你准备参加一场远足活动.给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row ...

  6. leetcode 1631. 最小体力消耗路径(并查集)

    你准备参加一场远足活动.给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度.一开始你在最左上角的格子 ...

  7. 【LeetCode】1631. Path With Minimum Effort 最小体力消耗路径(Medium)(JAVA)每日一题

    [LeetCode]1631. Path With Minimum Effort 最小体力消耗路径(Medium)(JAVA) 题目描述: You are a hiker preparing for ...

  8. 1-9九个数字组成一个九位数 如果从左边起取出1个数字,需要能被1整除,取出两个数字组成的数能被2整除,取出三个数字组成的数能被3整除,依次类推

    1-9九个数字组成一个九位数,数字没有重复.如果从左边起取出1个数字,需要能被1整除,取出两个数字组成的数能被2整除,取出三个数字组成的数能被3整除,依次类推...每次取数都是从左边取.问,这个数是什 ...

  9. 100个白球100个黑球,取出两个球,同色则补充黑色,异色则补充白色。最后剩什么颜色

    [题目描述] 桶中取黑白球 有一个桶,里面有白球.黑球各100个,人们必须按照以下规则把球取出来: 1.每次从桶中那两个球 2.如果是两个同色的球,那就再放入一个黑球 3.如果是两个异色的球,那就再放 ...

最新文章

  1. js判断 IE 浏览器
  2. swift3.0 渐变色
  3. 浅析人类最贵、最大的机器学习模型GPT-3及背后隐含的商业逻辑
  4. HCIE-OSPFV3
  5. 下一代云计算?容器云和微服务时代的来临
  6. 算法设计与分析知识点整理
  7. VM14 安装黑苹果教程步骤
  8. css背景颜色设置为半透明,关于css设置背景色透明,半透明
  9. 3dMax导入unity 材质问题
  10. 关于Windows系统脚本(jscript)
  11. 视频呼叫可视对讲门铃高清双向呼叫视频对讲屏
  12. SpringMVC学习----请求与响应
  13. npm 脚本跨平台设置环境变量命令 cross-env
  14. JZOJ5454. 【NOIP2017提高A组冲刺11.5】仔细的检查 树hash
  15. ThinkPHP文件包含漏洞分析
  16. Android 破解APK
  17. 《Python数据科学入门》之阅读笔记(第2章)
  18. PLSQL 解析XML示例2
  19. java实现2048小游戏(源码+注释)
  20. Linux源码的目录结构和Linux文件系统的目录结构

热门文章

  1. 美版有锁iphone 如何上电信3G
  2. Snagit_日文输入法:促音,长音,小写的输入方法
  3. 作业1 OO基础1-3、 设计一个教师类Teacher(属于cn.net.sdkd包)
  4. Excel单元格中怎么批量将两行合并成一行
  5. 自学前端开发,现在手握大厂offer,我的故事还在继续
  6. 增值电信业务经营许可证办理续期流程
  7. 个人卖云服务器需要什么证,云服务器个人使用能做什么 云服务器要不要个人认证...
  8. cmd查看端口占用,结束进程
  9. 上海计算机在职研究生学校排名,上海在职研究生考研周末班十大排名
  10. 安徽计算机在职研究生学校,安徽在职研究生招生学校2020