C++ 贪心算法总结

贪心算法的学习差不多已经两个周了,自己感觉十分的有收获,因为在贪心算法的第一节课,还对贪心了解甚微,上课的时候例题都有些听不懂。刚开始的时候一般就是在课后把老师的例题进行整理,在背包问题、册数问题、最优装载问题等等之后,自己也算是对贪心算法总结出了部分规律。在所有输入完成后(有的时候使用结构体会比较简单,便于表示),对现有数据进行排序(大部分的时候使用sort),最后顺应贪心思想(总是选区部分的最优解),得出结果。在老师布置了贪心算法的题后,总体来说还是非常的茫然,做开始的题的时候,同学们都非常的厉害,在我还没有搞懂例题的时候,同学们的A题、F题和K题就已经50多的提交了,那个时候就知道自己已经落下同学们一大截了。刚开始做A题的时候,发现可以不需要贪心算法用自己的思想解决题目,最后在自己电脑编译后得出的结果和答案相同,但最后还是发现了新的问题–超时。所以贪心算法在我认为,不仅可以解决一些寻找部分最优解的题目,更可以在某些需要耗时多的题中,缩短运算时间。刚开始做题的时候,一直需要对照老师上课用的课件和word文档里的例题答案,顺着答案去思考解题方法,慢慢的也算是AC了几道题,但是同学们呢已经做出我的题两倍以上了。最后也是把之前做过的题进行总结,不断重新来过,截至到这套题结束,已经除了E题,全部AC了。
感觉自己也是找到了贪心的诀窍,找对了方法,再加上在这些题中不断练习,才可以做出那么多的题。费老师的一段话也算是坚定了我的想法:“在我们这个水平阶段,拼的不是天赋,而是时间与努力。”因为自己是那种学习东西比较慢的学生,消化新的知识需要大量的时间才能记在心里,所以也只能笨鸟先飞了。

贪心算法在我的总结下,基本得出了几种题型,因为自己做过的题还是特别少,一定不是很全面,现在只整理这些。

  1. 背包问题
    输入完成后,通过成员的某项条件,进行排序。最后通过性价比的排序,用自己的背包量减去排序后的容量,同时加上得到的价值。
    这样类型的题目有最优装载问题(通过体积排序)、服务次序问题(通过等待时间排序)、javabean换猫粮等等。
  2. 区间调度问题
    这样类型也非常好理解,因为每个区间都有起点和终点,当我们例如在一段长度中想要选取尽可能多的区间(看节目、做作业)或者少(铺路、走廊之间搬桌子),对所有区间的终点进行排序,定义一个数值等于第一个区间的终点,然后判断是否大于下一区间的起点,进行循环。

其实剩下的题也都形形色色,逃不太出贪心的思想,比如在坐标轴上去点,也就通过距离的转化变为区间调度问题。其他的小船渡河、销售比赛、分发饼干也会继续加强这些没有固定模式的贪心算法题目。
希望自己在学dp的时候能过快一点掌握,不断提高自己的学习能力,不落下队伍。

你可能感兴趣的:(算法)