贪心通用证明套路

来源:互联网 发布:mac系统 流程图 编辑:程序博客网 时间:2024/05/06 13:35

例①:
• 1 VS n对战,回合制(你打他们一下,需要受到他们所有存活的人的攻击)
• 你的血量无上限,攻击力为1
• 对手血量及攻击力给定
• 消灭所有敌人掉最少的血量
分析:
我们很容易就想到先攻击攻击力 / 血量 高的敌人,但是要如何证明呢?
我们不妨假设在之前的对战中,我总计减少了敌人k滴血,接下来有两个选择,一是先攻击第i号敌人,再攻击第i + 1号敌人;二是先攻击第i +1号敌人,再攻击第i号敌人。
我们选择先攻击第i号敌人并假设这个选择是比第二个选择优的,之前我减少了敌人k滴血,也就是说时间经过了k秒(假设1秒打1下)。
则有以下公式(a代表攻击力,h代表血量):

//左边 = 第i号敌人的攻击力*攻击我的时间 + 第i + 1号敌人的攻击力 * 攻击我的时间 = 我掉的血量a[i] * (k+h[i]) + a[i+1] * (k + h[i] + h[i + 1]) < a[i + 1] * k + a[i] * (k + h[i + 1] + h[i])

推出a[i] / h[i] > a[i+1] / h[i+1],这个不等式说明了若先攻击第i号敌人更优,第i号敌人的攻血比应该比第i + 1号敌人的大
例②:
农夫约翰为了修理栅栏,要将一块很长的木板切割成N块。准备切成的木板的长度为L1,L2,…,LN,未切割前木板的长度恰好为切割后木板长度的总和。每次切断木板时,需要的开销为这块木板的长度。例如长度为21的木板要切成长度为5,8,8的三块木板。长21的木板切成长为13和8的板时,开销为21。再将长度为13的板切成长度为5和8的板时,开销是13。于是合计开销是34。请求出按照目标要求将木板切割完最小的开销是多少。
分析:
运用逆向思维,切割大木板相当于将小木板拼接成大木板。
还是运用上例的方法,假设我已经拼好了一块长为L的木板,我现在有两种选择,一是将其与第i块木板拼接;二是将其与第i + 1块木板拼接
假设与第i块木板拼接较优,应有

(L + L[i]) + (L + L[i] + L[i + 1]) < (L + L[i + 1]) +( L + L[i +1] + L[i])

推出L[i] < L[i + 1],即应该先与较短的木板拼接
例③:
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
分析:
假设前若干个人左手上的数乘积为k,列式如下:

原创粉丝点击