AtCoder Beginner Contest 042

A
题意:
给定三个数 \(A, B, C\) ,是否为两个 5 一个 7 。
\(1 \leq A, B, C \leq 10\)

题解:

if (a < b) std::swap(a, b);
if (b < c) std::swap(b, c);
if (a < b) std::swap(a, b);
std::cout << ((a == 5 && b == 5 && c == 7) ? "YES" : "NO") << "\n";

B
题意:
给定一些长度相同且为 \(l\) 的字符串,要求将它们拼接成一个字符串,且是字典序最小的。
\(1 \leq n, l \leq 100\)

题解:
设拼接串为 \(s\)
\(l\) 相同时,按字典序拼接能使 \(s\) 字典序最小。
设总的字符个数为 \(C\) 。可以直接 \(O(C \log C)\) 排序,也可以 \(O(C)\) 字典树。

考虑当 \(len\) 不同时怎么办?结论是 \(s\) 中任意两个相邻原串 \(a, b\) 满足 \(a + b < b + a\)
充分性显然。必要性可以反证。
只需要排序。时间复杂度 \(O(C \log C)\)

C
题意:
给定 \(k\) 个数 \(a_1, a_2, a_3, \cdots, a_k\) ,要求 \(x\) 的每个数位不能取 \(a_i\) 。找出大于等于 n 的最小 \(x\)

\(1 \leq k \leq 9, 0 \leq a_i \leq 9, 1 \leq 10000\) 。数据确保不会让可选的数位只剩下 \(0\)

题解:

直觉上从 \(n\) 暴力很对。只看答案,\(x\) 最坏只会比 \(n\) 多一位。 \(10^{6} \times 6 \times 7\) 完全在时间限制内。

想想 \(n\) 最大为 \(10^{5}\) 位怎么办?第一个权值 \(\geq n\) 且满足条件的 \(x\) ,也会是第一个字典序 \(geq n\) 且满足条件的。
很容易分析 \(x\) 最多只会比 \(n\) 多一位,于是是典型的数位 DP 模板。

D
题意:

给定一个 \(H\)\(W\) 列的矩形。一开始在 \(1, 1,\) ,可以向右或向下走。不能走到左下角 \(A\)\(H\) 列的矩形内,问从 \((1, 1)\)\((H, W)\) 的路径选择方案数。

\(1 \leq H, W \leq 10^{5}, 1 \leq A < H, 1 \leq B < W\)

题解:

从图中观察,左上角到右下角,如果不能经过红色矩形,则一定会经过紫色矩形。比如:

关键在于紫色矩形的第 \(H - A\) 行,一定有一个固定点是往下走的。于是问题就显然了。

枚举这个位置 \((x, y)\ (x = H - A, y \in [B + 1, W])\) 。然后这一步会被钦定往下走。

于是答案为 \(\binom{x - 1 + y - 1}{x - 1} \times \binom{H - (x + 1) + W - y}{H - (x + 1)}\)

固定点之前和之后是一个路径,按乘法原理贡献。不同的固定点产生的路径独立,按加法原理贡献。

int H, W, A, B; std::cin >> H >> W >> A >> B;
int x = H - A;
int ans = 0;
for (int y = B + 1; y <= W; y++) {
  ans = (1LL * ans + 1LL * comb(x - 1 + y - 1, x - 1) % MOD * comb(H - (x + 1) + W - y, H - (x + 1)) % MOD) % MOD;
}
std::cout << ans << "\n";
posted @ 2023-03-01 18:27  03Goose  阅读(17)  评论(0)    收藏  举报