和水题斗争了一个早上。
先讲贪心。。
一般我做贪心题都要给出正确性证明(松鼠cxr:证明?过不过看rp)
其实对于很多选择性问题,都会想到贪心,就是尽量选性价比高的。
当然有时候这种题目是dp,那么我们就要想一想,我们选择这个对后续状态的影响。
就是说,我们前面选择的对后面没有影响一般就是dp,否则一般用贪心做。
(有些数据水的题目比如NOIP2015PJT4 某位退役学长用贪心拿了满分)
实际上很多题都可以用搜索+剪枝替代dp(我当年都是这么做的),但是很难代替贪心
先看一题很坑的例子。
【买彩票】
【description】
商家在彩票里面做了手脚,使得每个抽奖点的中奖概率不是完全一样的,而且随着时间的变化而变化,不过这种变化是有规律的。对于第i个抽奖点,最开始的中奖概率是百万分之Pi,抽一次彩票花费的时间是T分钟,且每抽一张彩票后都要重新排队,每抽一次减少的概率为百万分之Di。
由于Smart还有一大堆事要做,于是他只能抽出H个小时去买彩票。由于抽奖地点都在一路公共汽车的线路上,所以怕麻烦的Smart决定按车站顺序抽奖,当然,Smart可以从任意一站开始抽奖(开始计时),对于经过的抽奖点可以买彩票,也可以不买。假设从第i个抽奖点到第i+1个抽奖点需要坐Ci分钟的汽车。
Smart希望能在有限的H个小时内获得最好的运气——抽奖的概率和最大。
【input】
第一行为一个整数n,表示抽奖点的个数。
第二行是两个整数H和T。
接下来的n行,每行3个整数,分别是Pi,Di,Ci(Cn=0)。
第二行是两个整数H和T。
接下来的n行,每行3个整数,分别是Pi,Di,Ci(Cn=0)。
【output】
仅有一行,为一个整数,即抽奖概率和的最大值。
【sample input】
2
1 20
200 100 10
300 200 0
1 20
200 100 10
300 200 0
【sample output】
500
100%的数据:1≤n≤200,1≤H≤10,1≤T≤60,1≤Pi≤10000,Di≤Pi,1≤Ci≤600。
这题。。我10min写了个dp,调了一天才知道是贪心。
为啥是贪心呢?很显然,对于每个抽奖地点你无论什么时候到那去,你花费一定时间获得的抽奖总概率是不变的。
然后你就可以预处理一下,枚举从哪个点开始到哪个点结束,算出中间的时间差里可以买到的最大的概率。
代码先咕着