• 每日一题之干草堆的移动


    经典的贪心分析:

    先上题目题目:

     

    初看题目一想想比较复杂,    挺难考虑 , 但其实画画图找找规律,发现其实也还比较容易模拟。

    首先最关键是要抓住一个重点:(每一个干草堆都要变成相同的值。。)。

    所以要考虑的就是这个相同的值应该是什么,其实模拟几遍发现就是它的平均值::简简单单的画个图:

    可以分为高的甘草堆和矮的干草堆。。。可以采用贪心分析:::

    假如说有一个干草堆高度太高了,那么他就可以给那些比较矮的干草堆赠送干草,赠送多少呢,使得自己的干草堆变成相同的那个平均数即可。赠送给哪个比较矮的干草堆呢,我们不管,赠送出去,送给空气。反正我赠送出去了,这些干草堆反正都是矮干草的,又不会丢。

    你也许会问:这样赠送出去就能保证所有高度相等吗?答案是肯定的,一个比较高的干草堆赠送之后,高度会变成平均数。所有高的干草堆赠送之后,所有高度肯定相等

    因此事情就变得简单了,,直接上代码即可

     

    1. //贪心先分析
    2. #include<iostream>
    3. #include<algorithm>
    4. const int N = 1e5 +10;
    5. int a[N];
    6. using namespace std;
    7. int main()
    8. {
    9. int n ;
    10. cin>>n;
    11. int sum = 0 , cnt = 0;
    12. for(int i=0; i<n; i++)
    13. {
    14. cin>>a[i];
    15. sum += a[i];
    16. }
    17. int hh = sum / n;
    18. for(int i=0; i<n; i++)
    19. {
    20. if(a[i] < hh ) cnt += hh - a[i];
    21. }
    22. cout << cnt<< endl;
    23. return 0;
    24. }

     关于贪心的一些知识

    百度百科解释::贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯 。。

    贪心算法不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优选择。使用贪心策略要注意局部最优与全局最优的关系,选择当前的局部最优并不一定能推导出问题的全局最优。贪心策略解题需要解决以下两个问题: [5] 

    1、该问题是否适合使用贪心策略求解,也就是该问题是否具有贪心选择性质 [5]  ;

    2、制定贪心策略,以达到问题的最优解或较优解 [5]  。

    要确定一个问题是否适合用贪心算法求解,必须证明每一步所作的贪心选择最终导致问题的整体最优解。证明的大致过程为:首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始,做了贪心选择后,原问题简化为规模更小的类似子问题。然后用数学归纳法证明通过每一步做贪心选择,最终可得到问题的整体最优解 [5]  。

  • 相关阅读:
    Allegro DFM Ravel Rule 板外异物检查
    深度学习入门(4) -Object Detection 目标检测
    MongoDB 的简介
    【AI实用技巧】GPT写sql统计语句
    k8s入门之Deployment(五)
    【Koltin Flow(五)】SharedFlow及StateFlow
    聚类 监督聚类 k-means聚类
    PX4模块设计之二十四:内部ADC模块
    LeetCode1137第N个泰波那契数
    python协程学习
  • 原文地址:https://blog.csdn.net/m0_62064241/article/details/125489025