欢迎来到Z_的博客

蓝天搂白点,风舞戏蓝天。细细风微去,轻云似过天。

一个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、国王游戏

思路:先考虑两两之间的关系,推出的关系能适用于所有(因为具有传递性)

 

posted @ 2021-03-16 20:51  Z_intey  阅读(63)  评论(0)    收藏  举报