题解
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]); } //*/