文章目录

Educational Codeforces Round 137

发布于

比赛链接

题解

B

直接构造,显然答是 $1, n, \left(n - 1\right), \left(n - 2\right), \ldots, 2$。

C

可以 DP,也可以贪心。

D

因为位数越多数越大,所以第一个串一定全选。接下来看第二个串怎么选。
考虑尽可能让 $s$ 的高位变成 1。可以把第一个 0 找出来,然后发现只能在这个 0 之前找区间,因为后边位数不够,所以 $n^2$ 枚举就行了,但是因为数据随机,所以第一个 0 出现得很早。

E

考虑 DP,$t_1$ 和 $t_2$ 都是 $10^{12}$,不能放进状态里,那么状态就确定了,$f_i$ 表示造成 $i$ 点伤害所需的最少时间。

首先考虑只用一种武器的转移:
$$f_{i + p - s} = f_i + t_i$$

两种武器一起用:
枚举武器 $k$ 的使用次数 $j$,则前 $j - 1$ 次都使用 $k$ 武器,第 $j$ 次两种一起用,则
武器 $k$ 创造的伤害是 $\left(j - 1\right) \cdot \left(p_k - s\right)$
另一把武器也不能闲着,可以趁武器 $k$ 冷却的时间继续攻击,则另一把武器创造的伤害是 $\lvert \dfrac{j \cdot t_k - t_{3 - k}}{t_{3 - k}} \rvert \cdot \left(p_{3 - k} - s\right)$
最后的两把武器一起攻击的伤害是 $p_1 + p_2 - s$

那么,设这三个伤害加起来的总伤害是 $u$,则
$$f_{i + u} = f_i + j \cdot t_k$$

代码

  • E

    // Please submit with C++14! It's best to use C++20 or higher version.
    constexpr bool __MTCS__ = 0;  // Spectre (n@rbtr.ee)
    #ifndef LOCAL                 // By rbtree (https://rbtr.ee)
    #pragma region HEAD           // DO OR DIE
    #endif
    #include <algorithm>
    #include <array>
    #include <bitset>
    #include <cmath>
    #include <cstring>
    #include <functional>
    #include <iostream>
    #include <list>
    #include <map>
    #include <numeric>
    #include <queue>
    #include <random>
    #include <set>
    #include <unordered_map>
    #include <utility>
    #include <vector>
    #ifdef ___RB_DEBUG___
    #include "rb_debug.h"
    #else
    #define dbg(...)
    #endif
    #define ra (scanf("%lld", &la), la)
    #define se(exp) begin(exp), end(exp)
    #define LIKELY(exp) __builtin_expect(bool(exp), 1)
    #define UNLIKELY(exp) __builtin_expect(bool(exp), 0)
    #define qmx(exp1, exp2, exp3) exp1 = exp3(exp1, exp2)
    
    typedef long long tp;
    using namespace std;
    void __Cored__(tp);
    tp la;
    
    signed main(/* >_< */) {
    for (static tp __TCS__ = __MTCS__ ? ra : 1, __NOW__ = 0; __NOW__ < __TCS__;
         __Cored__(++__NOW__)) {
    }
    return 0;
    }
    
    #ifndef LOCAL
    #pragma endregion HEAD
    #endif
    
    ////////////////////////////////////////////////////////////////////////////////
    
    constexpr tp Hat_H = 5003;
    
    tp f[Hat_H];
    
    void __Cored__([[maybe_unused]] tp __TID__) {
    tp p1 = ra, t1 = ra, p2 = ra, t2 = ra, h = ra, s = ra;
    memset(f, 0x3f, sizeof f);
    f[0] = 0;
    for (tp i = 0; i < h; ++i) {
      qmx(f[min(i + p1 - s, h)], f[i] + t1, min);
      qmx(f[min(i + p2 - s, h)], f[i] + t2, min);
      for (tp j = 1; j <= h; ++j) {
        if (j * t1 >= t2) {
          qmx(f[min(i + (j - 1) * (p1 - s) + (j * t1 - t2) / t2 * (p2 - s) + p1 +
                        p2 - s,
                    h)],
              f[i] + j * t1, min);
        }
        if (j * t2 >= t1) {
          qmx(f[min(i + (j - 1) * (p2 - s) + (j * t2 - t1) / t1 * (p1 - s) + p2 +
                        p1 - s,
                    h)],
              f[i] + j * t2, min);
        }
      }
    }
    printf("%lld\n", f[h]);
    }
    
    //*/

暂无评论

发表评论