CF1941场题解

Rudolf and the Ticket

算法:枚举。

题意简述:从 \(a\) 数组中和 \(b\) 数组中各选出一个数,使得它们的和不超过 \(k\),求选法数量。

考虑直接枚举每一种可能的搭配即可。

Rudolf and 121

算法:贪心。

题意简述:定义一次操作为,该位置上的数减去 \(2\),其前一个和后一个位置(必须存在)上的数都减去 \(1\)。问能否把数组中所有数变成 \(0\)

我们对 \(2\sim n-1\) 的所有位置尝试操作,最后查看每个位置是否都为 \(0\) 即可。

Rudolf and the Ugly String

算法:贪心。

题意简述:定义丑字符串为含有子串 map 或子串 pie 的字符串。现在可以多次选择一个位置并更改这个位置的字母,求把一个字符串变成不丑的字符串的最小操作数。

考虑换掉 mappie 里的字母 p 即可。

Rudolf and the Ball Game

算法:模拟。

题意简述:有 \(m\) 次传球,每次可能会沿着环顺时针或者逆时针传 \(k\) 个人,现在已知初始持球人和部分次的传球方向,问最后可能持球的人都有谁。

考虑对于每一次操作进行传递,如果遇到重复的传递直接返回,看传到最后一步有多少人能拿球即可。判重可以使用记忆化搜索。

Rudolf and k Bridges

算法:动态规划,前缀和。

题意简述:在所有的行中选出连续的 \(k\) 行建造桥墩,每个位置建造都有一个代价。要求这些行的第一列和最后一列必须建造,且相邻的桥墩距离不超过 \(d\)。问建造所有桥墩的最小代价。

考虑设 \(f_j\) 表示每一行最后一个桥墩建造在 \(j\) 的最小代价,发现朴素转移是平方的,但是可以使用单调队列优化,于是求出每一行的最小代价,然后用前缀和求出最小代价的连续 \(k\) 行即可。

转移式:\(f_j=\min(f_j,f_l+a_{i,j}+1)\),需满足 \(j,l\) 距离不超过 \(k\)

Rudolf and Imbalance

算法:二分。

题意简述:给定 \(a,b,c\) 三个数组,要求选出至多一对 \((i,j)\) 然后将 \(b_i+c_j\) 插入进 \(a\) 中。要求最小化从小到大排序后的 \(a\) 相邻两项的差的最大值。

考虑答案要么是第二大的差,要么是最大的差想办法砍成最优的两半,于是先线性求出这些东西。然后对于每一项 \(b\),在 \(c\) 中二分找出最优的与 \(b\) 匹配的那一项(事实上可能会有两项),然后尝试更新答案。

Rudolf and Subway

算法:图论。

题意简述:给一个无重边无自环的无向图,每条边有一个颜色。现在给出 \(s,t\),求 \(s\)\(t\) 最少要经过多少条不同颜色的边。

考虑对于每条有向边(拆开的无向边),连边 \(u\rightarrow c\) 边权为 \(1\)\(c\rightarrow v\) 边权为 \(0\),然后直接使用 \(0/1\operatorname{bfs}\) 求最短路即可。注意颜色不要和点的下标相同。

代码

posted @ 2024-09-04 20:58  zxh923  阅读(3)  评论(0编辑  收藏  举报