这一专题的题目做了不少,但似乎对贪心的感念依然有些模糊,下面简单写下我的理解。
一.概述
所谓贪心算法,就是用将一个大的问题细化成若干小问题,通过逐一解决这些小问题,最终求得问题解的方法。这种策略往往易于描述,易于实现—策略可行的话。
二.例题举例
1.木棒问题。
题意:一个加工木棍的机器,如果后面加工的木棍比前面的长且重,则不需要调机器,否则需要一分钟调机器,输入T组测试实例,每组由N跟木棒编写程序,计算并输出每组测试实例所用的最短的调机器的时间。
这个问题首先要对每组测试实例里的木棒进行排序,按长度升序,长度一样的轻的在前—预处理。
接着来到整个算法的核心部分—贪心策略:将木棒进行遍历,每一遍删去所有可以一起加工不用调机器的木棒,调机器用时+1,直至所有木棒都删完。
2.田忌赛马问题。
题意:输入田忌的马分数(分数代表好坏),国王马的分数,输出田忌最多能赢几局。
预处理依然是排序。
贪心策略:如果田忌最好的马能赢国王最好的马,让他俩比一局;如果田忌最差的马能赢国王最差的马让他俩比一局;如果上面两个都不行让田忌当前最差的马与国王最好的马比一局。
3.搬桌子问题。
题意:在400个两两相对房间之间搬桌子,走廊一次只能通过一张桌子,把桌子从一个房间移到另一个房间需要10分钟。输入T表示搬桌子的组数,输入N表示每一组要搬的桌子数,接下来的N行输入桌子搬出的房间和搬入的房间。输出每一组搬桌子的最短时间。
预处理排序。
贪心策略:因为走廊不可以同时搬运两张桌子,可以将每两个相对的门之间的走廊设为一个参数,统计每组桌子搬完后走廊的占用次数,最大占用次数乘10即为所求时间。
三.总结
从上面几个例题来看,要做贪心,往往要对问题进行一定的预处理,往往是排序(并不一定是)。然后进入到整个问题的核心部分贪心策略,贪心策略有的时候是实现问题的转化(如例3),有时候不用转化而是反复遍历。
贪心算反往往配合STL内容来实现,常用有:Vector,Set;sort排序函数也是常用的。