poj2586 贪心水题一道(一步贪心)

来源:互联网 发布:算法基础 第五版 pdf 编辑:程序博客网 时间:2024/05/02 01:58

刚AC了的一道水题。非常水。就算不会贪心,用枚举的方法最多也就2的12次方种情况,完全可以通过。

 

不过题目简单也可以便于我们更加清晰的看到贪心法的思想和结构。

 

题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2586

 

题意比较难懂,大意是一个公司在12个月中,或固定盈余s,或固定亏损d.但记不得哪些月盈余,哪些月亏损,只能记得连续5个月的代数和总是亏损(和<0算亏损),问全年是否可能盈利?若可能,输出可能最大盈利金额,否则输出“Deficit".

 

根据经验,贪心选择往往都在极端处选择。我们看下1-5月里,亏损的月数肯定应尽量往后选,证明如下(虽然很明显,但证明有利于使思维更清晰)

 

假设输入s=7d=5,那么前5个月至少亏损3个月。我们先证明3,4,5月必定被选中。优解中第5个月不选,那随便把前面某个亏损月和第五个月交换,不破换连续5月亏损的条件,所以得到另一个最优解。同理再选第四个,第三个。我们再证明只有3,4,5月被选中,否则得不到最优。因为假设2月被选中。2月包含在1-5,2-6中,对这两组而言,2必定已经是多余的了,因为包含3,4,5就可以使条件满足;而对3-6,4-7...而言,2是否选取对他们没有影响。因此如果最优解包含2,那么去掉2必定是个更优解。得证。所以选3,4,5必定是个贪心选择。

 

处理完1-5后,剩下的问题就好办了呵呵。

 

其实这题的子问题结构倒不是很清晰了,可以认为分叉出现在1-5月的选择中,接下来都是一条直线了(1-5月选定后,6月是s还是d由2-6必亏损这一条件已经确定了,以此类推)。假设最少有3个月亏损,那么1-5月的选择共有c(5,3)+c(5,4)+c(5,5)种情况,所以是一个16叉树,除了根节点外其他节点不再分叉。贪心选择选取其中一根树枝,因为之后不分叉,所以总共只做了一次贪心选择。

 

ps:输入要在注意终止条件为while(scanf("%d%d",&s&d)!=EOF)

 

原创粉丝点击