AtCoder Beginner Contest 184
A - Determinant
输入输出。
B - Quizzes
简单模拟。
C - Super Ryuma
分类讨论,万万没想到这题是花时间最多的。
- 一步可达:满足题目中的条件。
- 两步可达:
- 走一次对角线后欧几里得距离小于三,此时可以直接枚举和\((r_2, c_2)\)欧几里得距离小于三的点,然后看是否能够通过一次走对角线到达\((r_1, c_1)\)。
- 走两次对角线:就是过\((r_1, c_1)\)的对角线和过\((r_2, c_2)\)的对角线有整数交点。
- 不然必定三步可达,具体就是先走到对角线交点附近,在走到过\((r_2, c_2)\)的对角线上,最后到达\((r_2, c_2)\)。
D - increment of coins
概率DP。
由于参数都很小,所以整了个\(O(n^3)\)的DP。
令\(dp_{i, j, k}\)表示三种硬币数量分别为\(i, j, k\)的概率,初始时只有\(dp_{a, b, c} = 1\),其余皆为零。
一次操作时,选金币的概率为\(\frac{i}{i + j + k}\),选了之后转移到\(dp_{i + 1, j ,k}\)。所以\(dp_{i + 1, j, k} += dp_{i, j, k} \times \frac{i}{i + j + k}\)。
若金币数量达到100则结束,根据期望的定义\(E = \sum_{i = b} \sum_{j = c} (100 + i + j - a - b - c) \times dp_{100, i, j}\)。
银币和铜币同理。
E - Third Avenue
经典优先队列+BFS。
就是多写通过传送转移的部分。具体就是如果是第一次走到小写字母\(ch\)的格子,就枚举一遍所有\((i, j)\),看是否能够传送到\((i, j)\)。如果不是第一次走到,那么通过传送必不可能达到更优的答案,所以这个时候只考虑上下左右的转移就可以了。
时间复杂度\(O(26nm)\)。
F - Programming Contest
暴力+trick优化。
将这\(n\)个数等分成两部分。对于其中的一部分,暴力枚举\(2^{n_1}\)种情况,然后就得到了前\(n_1\)个数可能得到的所有结果,用数组\(t_1\)保存。
特别的,如果用的递归枚举,还可以加剪枝。
第二部分同理。
对\(t_1\)和\(t_2\)升序排序,然后就是\(t_1\)中拿一个数,\(t_2\)拿一个数,问组成的最大的不超过\(T\)的数是多少。这个就是比较经典的题了,二分或者双指针乱写完事。
时间复杂度\(O(2^{20} \log 2^{20})\),主要是排序的复杂度。