贪心算法之合并果子

Posted 亮星的信息学小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法之合并果子相关的知识,希望对你有一定的参考价值。


题     目

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

       每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。 可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。 多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。 假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
       例如有3种果子,数目依次为1,2,9。 可以先将 1、2堆合并,新堆数目为3,耗费体力为3。 接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为 12。 所以多多总共耗费体力=3+12=15。 可以证明15为最小的体力耗费值。


贪心算法之合并果子



解     析



贪心算法之合并果子

这道题

难度不大

毕竟是贪心

难度不会太高

但是

坑还是不少

贪心的题目

本身不难

他唯一的增加难度的方式

也就是挖坑了

下面开始“填坑”





加油!


贪心算法之合并果子



填     坑



贪心算法之合并果子
请注意一下题目
同志们
肯定都知道
先从小到大排序
接着再加就好了
但是就是如此
也有两个坑
填坑一号:
这道题的体力值
是第一个点
合并时的
体力值
不是将所有的体力值加起来
而是每个合并
都多加一次

填坑二号:
每次加完后
可能就不是
从小到大了
所以每次加完
都要再次排序


加油!


贪心算法之合并果子



下面是你们最爱的代码



贪心算法之合并果子

#include<bits/stdc++.h>

#include<iostream>

#include<cstdlib>

#include<cstdio>

using namespace std;

long long  sum,a[100001],n,d;

int main()

{

cin>>n;

for(int i=1;i<=n;i++)

cin>>a[i];

d=n;

sort(a+1,a+n+1);

for(int i=1;i<=d-1;i++)

{

a[1]+=a[2];

for(int j=2;j<=n-1;j++)

a[j]=a[j+1];

sum+=a[1];

n--;

sort(a+1,a+n+1);

}

cout<<sum<<endl;

return 0;

}





加油!


贪心算法之合并果子



反     思


贪心算法之合并果子

       怎么样,代码简单吧,可是,上洛谷测一测,只要数据量一大就会超时,再怎么优化都不行。

       只好搬救兵了,老爸来看了看,说这题思路是对的,但是计算量大,所以数据量一大就肯定超时。解决方法有两个,要不就采用堆排序的方法,不停地构造小跟堆。其实本题的标准做法是采用队列的方法,通过不停的进出队实现的,那样就简单的多,关于队列,老爸说过段时间讲数据结构的时候再详细讲,好吧,那就这样吧。




加油!


贪心算法之合并果子




贪心算法之合并果子

题外话:赶快开学吧!




加油




往期精彩推荐




某些图片来自互联网,如有侵权,请联系删除


欢迎关注

亮星的信息学小屋

亮星的信息学小屋

贪心算法之合并果子


觉得有用,请点右下方“在看”,谢谢鼓励


以上是关于贪心算法之合并果子的主要内容,如果未能解决你的问题,请参考以下文章

2017.8.13 贪心课小结

合并果子2之蚂蚁搬沙 贪心

基础算法——二分

贪心算法之最优合并问题

vij 1097 贪心

贪心合并果子