NOI导刊 2009 提高二

时间:2021-03-24 20:46:18

开灯

题目大意

对编号为\([i \times a]\)的灯进行操作,找出操作数为奇数的那一个

题目分析

难度: 入门

因为看到操作数为奇数,因此直接进行位运算,做亦或和

打砖块

题目分析

第一眼看上去像动归,但是有以下两个问题难以解决:

  1. 状态怎么表示
  2. 奖励子弹怎么处理

因为我比较弱,本来想写个\(50pts\),结果梦想直接破灭

其实下来看这50分超级好拿,我走入了要表示现阶段前面所有方块状态的误区,才没有得到这暴力分

如果不考虑奖励子弹,那么我们用\(f[i][j]\)表示前\(i\)列使用\(j\)个子弹的最大得分

这个dp就非常的简单:\[f[i][j] = max(f[i - 1][j], f[i - 1][j - k] + s[i][k])\]

那么我们再来考虑如果有奖励子弹的情况:

我们有一个很简单的做法:那就是如果这个有奖励子弹,这个砖块就相当于是免费的,我们能打就打

我们可以尝试这个更新到下面的非免费砖块,然后一样的dp

然而这个做法是错误的,考虑一下如果后面的如果在后面的序列中可以“打而不用完",然后最后再回来打这个,就会有更优的解

由于这样的话会破坏无后效性这一要素,我们考虑在这种情况进行分类讨论。

我们用\(by[i][j]\)表示对前\(i\)列砖块打\(j\)发子弹,且最后一发子弹不是对着前\(i\)列发出的最大值;\(bn[i][j]\)表示对前\(i\)列砖块打\(j\)发子弹,且最后一发子弹是对着前\(i\)列发出的最大值,然后我们特判一下最后的一发是不是在第\(i\)列打出就行了。

长方形

这道题没什么价值,而且结题部分要写很长,我直接粘一下题解的链接
https://www.luogu.org/problemnew/solution/P1950

收费站

题目大意

给定一个无向图,求\(u\)\(v\)中,在总长不超过\(s\)的情况下,在所有点中\(f\)的最大值最小是多少

题目解析

因为求的是最大值最小,我们二分一下这个值,然后小于这个值的边我们就删除掉,跑一下最短路就可以了

难度大概是提高-

不是很熟悉二分和链式前向星的模板,所以调试略微久了点,最终二分还写挂了,只有\(80pts\)