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

  • 相关阅读:
    Java内存模型与volatile
    Struts2验证框架的注意事项
    利用Java编写简单的WebService实例
    加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度
    Java关键字synchronized详解
    JAVA对象的序列化与反序列化
    加速Java应用开发速度3——单元/集成测试+CI
    java程序性能优化之找出内存溢出元凶
    加速Java应用开发速度2——加速项目调试启动速度
    java实现动态切换上网IP (ADSL拨号上网)
  • 原文地址:https://www.cnblogs.com/zengzk/p/14021834.html
Copyright © 2011-2022 走看看