2022 zafu校赛题解

A 煎饼哥哥好鲨题

读入时,分别统计四种不同提交结果,最后按题目要求输出即可。

代码链接

B 富哥磊神

暴力枚举三种纸币的数量,统计合法付款方式的数量即可。注意优化暴力枚举的范围。

代码链接

C 倪佬的左右互博

首先,虽然我们有很多颗棋子,但我们只需要移动最优的,也就是离某一个边界最近的棋子就行了。因为我只需要把一颗棋子移出去,移动其他的棋子只会减少我去移动最优的棋子的次数,对我是不利的。

现在,假设我把一颗棋子移到了不在角落的边界格上,那对方没有办法,只能把我贴着的这条边界边给拦上,不然下次我移的时候我就出去了。那么他把这条边拦上了,我就向左边或右边一直走,他也只能一路拦。直到我来到了角落的位置,我下一次可以选择两个方向出去,而他只能拦一边,这种时候我就赢了。

那什么样的时候我赢不了呢?就是我最优的棋子也在比较内部的地方,在我把它往最近的边界移的时候,对方有足够的时间把四个角都各封一条边。这需要耗费对方四个轮次,因此,如果最优的棋子和边界边之间隔了4个以上的空白格,我就赢不了了。

注意这题的数据范围是可能出现棋盘上一颗棋子都没有的情况的。这种时候移棋子的人当然赢不了。

代码链接

D 实验室的新密码

按字符串的形式读入后,看下有无相邻两位一样即可。

代码链接

E 排名输出

先将每个人按给出的过题数和罚时进行排序,然后根据每个人的初始位置和结束位置来预处理出每个人的排名,处理时注意两个人同排名的情况,最后O(1)查询。

代码链接

F 瓜瓜的炉石

第一种解法

定义状态 \(f(i, j, k)\) 表示前 \(i\) 个数中取 \(j\) 个数和为 \(k\) 的方案数量。

设当前第 \(i\) 个数的值为 \(x\),则有转移:

\[f(i,j,k) = \sum_{l=0}^{i-1} f(l, j - 1, k - x) \]

最终答案就是:

\[\sum_{i=1}^n \sum_{j=1}^n f(i, j, j\times A) \]

代码链接

第二种解法

每张卡片只有选和不选这两种状态,因此可以用01背包dp的方法来写这道题。

发现题目的数据范围很小,而平均值本身较难转移,可考虑将卡牌权值和作为一个维度进行存储和转移。

可以设 \(f(i,j,k)\) 表示前 \(i\) 个数选 \(j\) 个数,和为 \(k\) 的方案数。

但是因为是01背包,所以可以用滚动数组优化掉第一个维度 (详情请自行学习01背包优化)。

\(f(i,j)\) 表示已经拿了 \(i\) 张卡,卡的权值和为 \(j\) 时的选法种类。

可得到转移方程:

\[f(i,j) = f(i - 1)(j - x[i]) \]

也就是取了第 \(i\) 张卡的时候的转移。

注意转移时第二重循环和第三重循环要倒序遍历 (详情请自行学习01背包优化)。

代码链接

G 神和他那不争气的队友

对于每次询问,只要让增加的学习量 \(d\) 满足

\[d+L+1 \ge t_{i}\times v \]

同时要让使用的魔法次数最少,考虑贪心,优先释放增加量大的魔法。可以将所有魔法根据增加量降序排序后进行前缀和,即可得到释放 \(i\) 个魔法最多能让队友要学的知识增加 \(sum_{i}\)

对于每次询问,只要二分找到满足 \(sum_{i}+L+1\ge t\times v\) 的最小下标 \(i\) 即为答案,总体时间复杂度 O(nlogn)。

代码链接

H 磊神的铁路

首先用 floyd 预处理出各点之间的最短距离,之后对每条边判断。

\(a,b,c\) 分别为边连接的两个点和边的长度,\(dis\) 为两点之间最短距离。显然,当 \(c > dis\) 时可以直接删去。当 \(c = dis\) 时,我们就看 \(a,b\) 两点之间是否还有其他边数大于一且长度等于 \(dis\) 路径能相互到达,如果有就删除,否则保留。

因为如果存在这样一条路径,就说明该路径上有多条边,且这些边长度小于 \(dis\),这些边能使该路径上的某些点到其他点的距离更短,而直接连接 \(a,b\) 两点的该边就可以删去了,判断方法可以在 floyd 更新边时,给被更新的两个点打个标记,之后O(1)判断即可。

代码链接

I 瓜瓜去旅游

一共能走 \(k\) 步,我们希望能让返程所走的次数最小,这样访问的城市会更多。

首先我们可以确定每条线路最多重复经过一次,于是我们只需要贪心地让只经过一次的线路数量最多,也就是求一条最长链,如果走完最长链还有剩下的步数,我们将剩余步数除 \(2\) 产生的贡献加上即可。

树上求最长链也就是求树的直径,经典树形dp。

代码链接

J 磊神环游世界

可以将地面的轮廓拆分成多条轮廓直线来看,而每条轮廓直线只能被它上方的点看见。

因此可以把每条直线看作一条向右指的向量,用半平面交得到所有向量的左半平面交出来的凸包,热气球离地面的高度就是该凸包和地面轮廓线的距离。

不难发现形成这个最近距离的两点中一定至少有一个点是凸包上的拐点或地面上的拐点,因为如果两个点都不在端点上的话,往距离减小的那端移一定能使情况更优。

因此可枚举凸包上的拐点和地面上的拐点,做一条过它的垂直于 x 轴的直线,求直线和另一个轮廓的交点与该点的距离,取最小即可。

代码链接

K ycy 的制裁

求和

\[\sum_{i=0}^n\sum_{j=0}^i \begin{Bmatrix} i \\ j \end{Bmatrix}\times 2^j \times j! \]

首先我们知道第二类斯特林数的 EGF:

\[\sum_{i = 0}^\infty {i \brace k} \frac{x^i}{i!} = \frac{(e^x - 1)^k}{k!} \]

考虑赋为多项式系数

\[f_i = \sum_{j=0}^\infty 2^j \times j! \begin{Bmatrix} i \\ j \end{Bmatrix} \]

则 EGF 为

\[\begin{aligned} f(x) &= \sum_{i=0}^\infty f_i \frac{x^i}{i!} \\ &= \sum_{i=0}^\infty \sum_{j=0}^\infty 2^j \times j! \begin{Bmatrix} i \\ j \end{Bmatrix} \frac{x^i}{i!} \\ &= \sum_{j=0}^\infty 2^j \times j! \times \frac{(e^x-1)^j}{j!} \\ &= \frac{1}{3-2e^x} \end{aligned} \]

代码链接

L xygg找1

考虑 DP,设 \(f_i\) 为当前所有数的期望归 \(1\) 步数,有

\[f_i = 1 + \frac{1}{n} \sum_{j=1}^n f_{\gcd(i,j)} \]

考虑 mobius 反演,

\[\begin{aligned} n(f_i - 1) &= \sum_{j=1}^n f_{\gcd(i,j)} \\ &= \sum_{d \mid i} \sum_{j=1}^n f_{d} [ gcd(i, j) = d] \\ &= \sum_{d \mid i} f_d \sum_{u \mid i/d} \mu(u) \left\lfloor \frac{n}{ud} \right\rfloor \end{aligned} \]

拿到这个式子还不能转移,可能存在 \(d=i\) 的情况,总之筛一下因子就成。

代码链接

posted @ 2022-11-19 19:34  AsindE  阅读(358)  评论(0编辑  收藏  举报