AtCoder Beginner Contest 184

AC代码

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})\),主要是排序的复杂度。

posted @ 2020-11-22 22:10  _Backl1ght  阅读(443)  评论(0编辑  收藏  举报