2022 iCPC 沈阳
C Clamped Sequence
暴力
这里非常的小丑,首先应该注意到,数据范围是 5e3,是可以支持 $O (n^2)$ 的时间复杂度的,所以其实可以直接暴力枚举
这里可以学习一下题解的部分写法:
去重复技巧:
F Tavern Chess
模拟 #概率 #dfs
这里同样是发现很多问题,赛时的时候没有写出来,很快就想到了用 dfs 暴力模拟,但是写 dfs 的过程非常的不顺利,对如何写 dfs 函数不熟悉,这里也有很多可以学习题解的点
审题问题
有些长难句,就 TM 巨难读 When a team takes the attack, the leftmost minion taking the minimum number of attacks from the team attacks one of the alive minions from the other team uniformly at random, and then the other team takes the attack. 这巨话翻译错了,导致我模拟反复改,最后也没有改对,平时还是要少依赖翻译
solve 函数内嵌 dfs 函数的非 C++23 写法
概率计算
uniformly at random,计算这个概率是不能通过计算总数量来得到,还必须要通过每一层的概率相加得到,可能是我的概率学的不好,不太理解两着有什么区别,有机会我要再找几道概率的题目写一写,看到底怎么回事。
另一个启发的点就是,在计算这类概率的时候,直接全部开 double 就完事了,最后要是还乘以一个 $1.0$ 反而麻烦
dfs (递归)设计
我自己写的 dfs 简直就是一坨,最后甚至 TLE 了,现在想来应该就是我每次到达终点都要计算一次 A 队和 B 队的生存状态,这个时间开销的巨大的,另外,我还传入了两个复制的数组作为参数,这就更加 sb,纯纯冗余的代码。
dfs 的参数应该带有两类信息,一个是可以帮助确定递归边界的信息(i,n,在本题目中为队伍 1 和队伍 2 的死亡数量),还有一个是递归过程中需要传递到终点的参数。
写 dfs 时,先考虑递归的边界,先把边界条件写好,再写递归主逻辑
在 dfs 中,每次调用递归后一定要进行复原!!!,这个题目,我就是忘记把一个比较外层的攻击次数复原,导致了很多次的模拟错误。