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} imes frac{i}{i + j + k})。
若金币数量达到100则结束,根据期望的定义(E = sum_{i = b} sum_{j = c} (100 + i + j - a - b - c) imes 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})),主要是排序的复杂度。