zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 116 (Rated for Div. 2)

    Educational Codeforces Round 116 (Rated for Div. 2)

    A. AB Balance

    易得至多改一个位置。

    然后枚举改哪个位置,特判不改。

    对于一个字符串,每次扫一遍就可以算出ab和ba的个数。

    B. Update Files

    每一轮最大的增量会是这样变化的:1 2 4 8 ... k k k ...

    前面倍增的轮数不会太多,直接模拟。

    到达k后就可以直接算剩余轮数。

    C. Banknotes

    肯定是尽量用面额较小的,这样组出来的才会小。

    假设(c * a_i = a_{i+1}),则(a_i)至多用(c - 1)次。因为(a_i)用了(c)次得到的答案,肯定可以用1个(a_j)替换(c)(a_i),然后再凑到。

    当剩余次数(k >= c)时,就使用(c - 1)(a_i)

    否则,再使用(k + 1)(a_i)就是凑不到的数。

    D. Red-Blue Matrix

    假设将行重新排列,红色的更靠上方。结合题目,就是将原矩阵划分成4个部分,且左上大于左下,右下大于右上。

    这里,(A)大于(B)相当于(min(A) > max(B))。根据这一点,我们可以只关注最大最小值,所以可以将每行的前缀最大最小值和后缀最大最小值求出来。分别记为(prefixMin,prefixMax)(suffixMin,suffixMax)

    不妨先将矩阵划分为左和右两部分。枚举划分的列数,即枚举前(i)行为左侧。由于只关注最大最小值,左侧的行可以用行的前缀最大和最小值代替,右侧类似。之后只需要关心行的划分。

    对于左侧的红色行而言,其中的最小值越大越好。不妨对于左侧,将行按最小值降序排序。

    现在再去枚举划分的行数,即枚举前(i)行为红色。

    由于只关注最大最小值,对于左侧,红色的行可以用前缀最小值代替,蓝色可以用后缀最大值代替。右侧类似。分别记为(LeftUpMin, LeftDownMax, RightUpMax, RightDownMin)

    如果满足(leftUpMin > leftDownMax and rightUpMax < rightDOwnMin),就是可行的方案。

    E. Arena

    组合数学+动态规划。

    假设某一轮,剩余(n)个人,可能的最大生命值为(x),有(k)个人在这一回合挂了。这个(k)个人的生命都可以是小于(n - 1)的任意正整数。

    剩余(n - k)个人,可能的最大生命值为(x - (n - 1))。这里就形成了一个子问题,然后就可以动态规划求解。

    综上,

    [operatorname{DP}(n, x) = sum_{k = 0}^{n} C_n^k imes operatorname{power}(n - 1, k) * operatorname{DP}(n - k, x - (n - 1)) ]

    然后易得:

    • (x < 0, operatorname{DP}(n, x) = 0)
    • (operatorname{DP}(0, x) = 1)
    • (operatorname{DP}(1, x) = 0)
    • (x < n, operatorname{DP}(x, n))

    递归记忆化搜索一下就可以了。

    吐槽

    疏于训练,代码能力直线下滑。

    C想了半天,D一下就想到正解但是代码绕半天写不出来。

    E题不会,大概是个组合数学。

  • 相关阅读:
    使用NodeJS模块-第三方提供的模块(什么是npm)
    nodejs编写后台
    解决npm下载慢的问题
    全局安装与本地安装
    NPM常用命令
    使用NodeJS模块-NodeJS官方提供的核心模块
    导出模块成员
    Node.js提供了哪些内容(API)
    node.js的安装
    什么是node.js
  • 原文地址:https://www.cnblogs.com/zengzk/p/15484175.html
Copyright © 2011-2022 走看看