Codeforces Round 933 (Div. 3)
A. Rudolf and the Ticket
思路:
- 按照题意,暴力枚举
时间复杂度:\(O(nm)\)
1 | void solve() { |
B. Rudolf and 121
思路:
- 每次对于一个元素的两边进行
-1
操作,对当前这个元素进行-2
操作 - 这个操作可以转换一下,因为最终序列的值要让它都为
0
,那么我们可以直接从前往后线性枚举,每次对于第i
位,直接减去a[i]
,第i + 1
位,直接减去2 * a[i]
,对于i + 2
位,减去a[i]
,只要枚举过程中出现一个元素不为0
,那么一定不行,因为它无法达到全部为0
的状态
时间复杂度:\(O(n)\)
1 | void solve() { |
C. Rudolf and the Ugly String
思路:
- 需要关注的字符串种类只可能有
pie
,map
,mapie
,其他样式的字符串,就算出现也对于答案没有影响 - 每当出现一个
pie
或者map
,那么我们就需要删除一个字符,去破坏这个字符串,那么ans += 1
- 而当出现一个
mapie
的时候,只需要删除一个字符,但统计map
和pie
的时候多统计了一次,所以ans -= 1
时间复杂度:
1 | void solve() { |
D. Rudolf and the Ball Game
思路:
- 直接设状态 \(dp_{ij}\) 为经过第 \(i\) 轮后,\(j\) 的位置
- 最开始,\(c\) 不为 \(1\),我们就顺时针走,当 \(c\) 不为 \(0\),我们就逆时针走,然后每一轮走完就更新当前状态,最后输出那些点是可能的位置
时间复杂度:\(O(nm)\)
1 | void solve() { |
E. Rudolf and k Bridges
思路:
- 用 \(dp_{ij}\) 来统计每一行的满足条件的最小的和,这里满足条件就是求在一个长度小于等于 \(d\) 的区间里的最小值,然后 \(dp\) 一下,求在这个区间里的最小值之和。
- 然后用一个数组记录最小总和,最后暴力求连续的 \(k\) 行的最小和
时间复杂度:\(O(n^3)\)
1 | constexpr i64 inf = 1LL << 60; |