T1 送分题
直接把代码复制提交并不能通过此题。
但是如果你仔细分析代码的递归过程,可以发现:
当 n≥20180001 时,答案永远是 20182017。
T2 ***游戏
将必胜态和必败态的转移用 DP 递推或者记忆化搜索出来即可。
一个必败态的后继状态全部是必胜态,一个必胜态的后继存在比败态。
T3 谁是神射手
先手获胜的概率是:先手和后手均失败了n次后先手成功。即
α∑i=0∞(1−α)i(1−β)i=1−(1−α)(1−β)α
同理,后手获胜的概率为
β∑i=0∞(1−α)i+1(1−β)i=1−(1−α)(1−β)β(1−α)
需要注意特判公比为 1 的情况,否则可能因为除以 0 造成 Wrong Answer。
T4 明七暗七
考虑这样一个问题:在 [1,n]内含有 7或者能被 7整除的数有多少个。
这个问题是经典的数位 DP 问题,将状态设计成三维即可。
那么对于原问题:若 [1,m] 中要拍手的有t 个。设答案为x,则x是第一个满足 [1,x]中恰好有t+n个的数。显然 x 是具有二分性质的。
T5 Applese的超能力
判断n−1 能否被m−1整除即可。
需要注意特判n=1和m=1的情况。
T6 BFS
把大小写转换一下以后,暴力匹配即可。
std::string::find 了解一下。
T7 CSL分苹果
做一个容量为⌊2∑wi⌋的01背包即可得到 Wavator 分到苹果。
数据范围较小,各种正确的姿势都可以过。
T8 CSL的校园卡
BFS 搜索即可。难点在于合理的状态表示。
d[S][x1][y1][x2][y2] 表示目前已经走过的坐标集合和两个人对应的坐标的状态的最短时间。其中S需要使用二进制状态压缩进行存储。转移则需要枚举两个人的4×4=16种走法。
这样的空间复杂度是O(2nmn2m2)。如果搜索的处理不合理或者数组开多了一点(如果是高维开多了一点可能就不是一点了),可能会导致 Memory Limit Exceeded。
可以借助以下例子来理解为什么其他的状态表示是不合理的。
3 3
XOX
OSO
XOX
T9 新建MIcrosoft Office Word文档
可以用一个std::set<int>来维护可用的编号,按题意模拟即可。
T10 方格填色
每列有 2m种状态;容易想到使用状压DP。
令白色为 1,黑色为0。dpi,j表示前i列,最后一列的填色方法为j的方案数。
转移就是枚举下一列的状态:如果按为与为0(左右相邻不能同时为白色)且按为或不为0(相邻两列不能全部为黑色)即可转移。
很容易可以写出O(n4m)的算法。
但是这里的n 很大,需要使用矩阵快速幂加速递推。比如2×n的情况:
⎝⎜⎜⎛dpi,0dpi,1dpi,2dpi,3⎠⎟⎟⎞=⎝⎜⎜⎛0111101011001000⎠⎟⎟⎞⎝⎜⎜⎛dpi−1,0dpi−1,1dpi−1,2dpi−1,3⎠⎟⎟⎞
他疑问可加以下交流群(加入一个即可啦~)
牛客多校算法训练营1:453799454
牛客全国算法训练营2:330766563
牛客多校算法训练营3:934889305