一个OIer的做题笔记
为了督查自己,特意开坑记录。
2021.3.16
1、P5662 [CSP-J2019] 纪念品
开始看这题时没什么思路,但观察了一下,发现这道题满足无后效性,于是就想出了下面的贪心方案。
贪心方案:每天只要用前一天剩下来的钱来做当天的最优方案,这样这题就像完全背包问题了。
如何证明该想法的正确性(如果认为之前做的决策放到现在不是最优的)?
比如 第1天 买了一个 物品A,用了10元,第2天 卖了 物品A ,获得了20元,但 第3天 物品A 价格为100元,这个时候 第2天 如果不卖等到 第3天 买会更赚(那是不是之前的决策不优了呢?不,对于 第1天 该决策是最优的),我们可以在 第2天 时再将 物品A 买回来,到第三天再卖,这样就相当于将 物品A 在 第1天 买 第3天 卖。所以每天只要考虑当天和明天的关系就行了,不需要考虑之前那些天。
f[k] 表示当天有 k 元的最优方案,每次 f[k] 清空进入下一天.
for (int i=1; i<=t; i++)//循环天数 { memset(f,0,sizeof(f));//每天将f清空 for (int j=1; j<=n; j++)//完全背包 { for (int k=p[i][j]; k<=ans; k++) { f[k]=max(f[k],f[k-p[i][j]]+p[i+1][j]-p[i][j]);//买与不买,买了就当做以明天的价格卖了(p[i+1][j]-p[i][j])这是赚的差价(上面讲过这样贪心的正确性)。
} } ans+=f[ans];//答案加上当天赚的钱 }
2、P3243 [HNOI2015]菜肴制作
看完题目认为只要按照字典序从小到大跑一边拓扑,但这个贪心想法是萎的,
如样例中,有5道菜,5要在2前做,4要在3前做。如果按照这个想法来做结果是1,4,3,5,2.
但这样不能满足2尽量在3前做这个条件,正确答案应该是1,5,2,4,3.
所以要换一种贪心想法:从后往前做,在满足限制下,越后的字典序越大。
为了实现这种想法,我们要把所给的限制换种方式表达。
如样例就为,有5道菜,2要在5后做,3要在4后做。因为3字典序大于2,所以3是最后一道菜,接着5比2字典序大,所以倒数第2个是5,接着2比1大,5比1大,接着第1道菜为1.从前往后答案就为1,5,2,4,3.
再证明一下正确性:因为从后往前选字典序大 与 从前往后选字典序小的一样能满足所给限制,但这样还能考虑到 字典序小的在字典序大的后一直没被选到而导致不符合(i尽可能在i+1前)这条限制 的情况。
有了这个贪心方案,就可以反向建边,跑一边拓扑排序,再反序输出答案。
注:当拓扑完,存到的点数如果小于n,则为无解情况。
3.17
1、国王游戏
思路:先考虑两两之间的关系,推出的关系能适用于所有(因为具有传递性)



浙公网安备 33010602011771号