zoukankan      html  css  js  c++  java
  • 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} 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})),主要是排序的复杂度。

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/zengzk/p/14021834.html
Copyright © 2011-2022 走看看