该题目也属于经典的贪心算法,在这里熟悉C++里优先队列的使用。

需要导入头文件:   #include<queue>

从这个问题可以深挖出神奇的哈夫曼树问题。

因为这题里合并的是二叉树,所以结点数量什么的都不用考虑。用堆维护数据,每次贪心取两个最小的合并即可(因为要使大数被累加的次数尽量少)。

//升序队列,小顶堆

 //       这里一定要有空格,不然成了右移运算符↓↓
priority_queue <int,vector<int>,greater<int> > q;
//降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

和队列基本操作相同:top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
pop 弹出队头元素

题目描述

在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

输入输出格式

输入格式:

输入文件fruit.in包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。

输出格式:

输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。

输入输出样例

输入样例#1:

3
1 2 9

输出样例#1:

15

说明

对于30%的数据,保证有n<=1000:

对于50%的数据,保证有n<=5000;

对于全部的数据,保证有n<=10000。

解题代码:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string>
#include <queue>
using namespace std;
int main(){int n,x,ans=0;priority_queue<int,vector<int>,greater<int> >q;cin>>n;for(int i=0;i<n;i++){cin>>x;q.push(x);}while(q.size()>=2){int a = q.top(); q.pop();int b = q.top(); q.pop();ans += a+b;q.push(a+b);}cout<<ans<<endl;return 0;
}

贪心算法——洛谷(P1090)[NOIP2004]合并果子相关推荐

  1. 贪心算法——洛谷(P1478)陶陶摘苹果

    我们看一下,在这个题里,所有苹果费力气也就是占背包空间不同,但是价值都是1.背包问题主要是为了解决拿得多却不一定价值最大,拿价值大的却可能装不下其他有价值的东西而使人陷入两难才被发明的算法.对于价值相 ...

  2. 【洛谷1090】合并果子

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  3. 贪心算法——洛谷(P4995)跳跳!

    很简单的一道题,就是排序之后贪心+模拟: 先将台阶的高度从小到大排序,注意0也算,但是不是输入进去的: 每次从距离 最小和最大值之间跳跃, 从最小跳到最大之后,最大值不变,最小的下标+1,从最大跳到最 ...

  4. 贪心算法——洛谷(P1094)纪念品分组

    读入之后先用sort排序,然后用两个指针一起向中间走,每次选择都尽可能的让当前状态下最大的和最小的分在一组,如果不行就最大的单独分一组,这样贪心下来就是最少分的组了.证明如下: 如果最大的a[r]不与 ...

  5. 贪心算法——洛谷(P1803)

    这道题目官方说的是 线段覆盖 的问题,我觉得还是和区间调度一样 采取结构体存放比赛开始和结束时间,用sort排序,自定义cmp, 将结束时间从小到大排序,然后依次选择符合的,即为最终答案 此题为典型的 ...

  6. 贪心算法——洛谷(P1106)删数问题

    首先,我们先举一个例子: 1 7 5 4 3 8 删的个数:4 不难看出: 第一次删的应该是 7 第二次删的应该是 5 第三次删的应该是 4 第四次删的应该是 8 那么,剩下的数就是"13& ...

  7. 贪心算法——洛谷(P3817)小A的糖果

    这道题很简单,但是需要思考 当相邻的两盒大于x到时候,应该先吃那一盒呢? 答案:正着遍历,吃后面:反着遍历,吃前面! 为什么是这样的呢? 比如一个样例: 5 6 4 5 3 6 2 此时,若正着遍历, ...

  8. 信息学奥赛一本通 1927:【04NOIP普及组】花生采摘 | OpenJudge NOI 1.13 38:花生采摘 | 洛谷 P1086 [NOIP2004 普及组] 花生采摘

    [题目链接] ybt 1927:[04NOIP普及组]花生采摘 OpenJudge NOI 1.13 38:花生采摘 洛谷 P1086 [NOIP2004 普及组] 花生采摘 [题目考点] 1. 模拟 ...

  9. 信息学奥赛一本通 1111:不高兴的津津 | 1926:【04NOIP普及组】不高兴的津津| OpenJudge NOI 1.9 03 | 洛谷 P1085 [NOIP2004 普及组] 不高兴的津津

    [题目链接] ybt 1111:不高兴的津津 ybt 1926:[04NOIP普及组]不高兴的津津 OpenJudge NOI 1.9 03:不高兴的津津 洛谷 P1085 [NOIP2004 普及组 ...

最新文章

  1. gitlab报错 fatal: index-pack failed error: RPC failed; result=18, HTTP code = 200解决方案
  2. django项目用 setuptools打包构建(待更新)
  3. anki怎么设置学习计划_打篮球怎么训练弹跳力?NBA经典训练计划值得学习
  4. 21个值得收藏的Javascript技巧
  5. java异常体系分类(面试)
  6. JavaScript方法
  7. 什么情况下使用 if()后面的else可以省略不写
  8. LA 3027 并查集
  9. php实现观看记录,PHP实现浏览历史记录
  10. 阿里无线11.11:手机淘宝移动端接入网关基础架构演进之路
  11. Web端和移动端接入萤石云平台的视频数据
  12. 微软win2008停止服务器,微软终止对windows server 2008 企业版和2008 R2的支持
  13. Java实现 LeetCode 592 分数加减运算(纯体力活)
  14. c语言中char有无符号,char代表有符号还是无符号?
  15. Cadence OrCAD Capture 全局修改TitleBlock信息
  16. 思考的救赎(一):三消游戏实现探索
  17. TCPIP卷一(11):EIGRP的汇总、stub、leak-map参数
  18. 敲黑板,定积分也有换元和分部积分法!
  19. 换了爸爸,推特用户坐不住了……
  20. Word论文排版(3)公式字体/编号

热门文章

  1. 【转载】大规模网站架构实战之体系结构
  2. 轻博客:企业品牌互动传播利器
  3. Unity shader入门之数据类型
  4. 代码重用_WebAssembly的速度和代码重用
  5. java 区块链开发_Java开发人员的区块链入门
  6. 如果我使用Docker,是否需要OpenStack?
  7. (19)HTML5 <progress> 标签
  8. Java静态方法和实例方法 java中的数组作为形参传入
  9. sort和qsort函数的用法
  10. php怎么写确认密码,如何在Laravel 5中验证当前密码,新密码和新密码的确认? - php...