[CodeForces] CF628 题解

A. Tennis Tournament

Link-CF
Link-Luogu

【题目大意】

\(n\) 个选手进行若干场比赛,胜者保留,败者淘汰。每场比赛为两人。每场比赛每个人需要 \(b\) 瓶水,裁判需要 \(1\) 瓶水。每个人参加这些比赛总共需要 \(p\) 条毛巾。

注意:洛谷题面翻译有误!建议看英文版。

【解题思路】

每场比赛淘汰一个人,总共淘汰了 \(n - 1\) 个人,所以有 \(n - 1\) 场比赛。每场比赛两个人,还有一个裁判,共 \(2 * b + 1\) 瓶水。这样,进行这些比赛总共需要 \((n - 1) \times (2 * b + 1)\) 瓶水。

每人总共 \(p\) 条毛巾,所以需要 \(n \times p\) 条毛巾。

综上,答案分别为 \((n - 1) \times (2 * b + 1)\)\(n \times p\)


B. New Skateboard

Link-CF
Link-Luogu

【题目大意】

给定一个字符串 \(s\),统计 \(s\) 有多少个字串构成的数能被 \(4\) 整除。

【解题思路】

若字串长度为 \(1\),只需要扫一遍字符串判断就行。

若字符串长度 \(> 1\),考虑 \(4\) 的整除条件。

我们知道,如果一个数最后两位组成的两位数能被 \(4\) 整除,则这个数能被 \(4\) 整除。

这样,我们只需要判断字符串里连续两个数组成的两位数是否能被被四整除,如果能,则可以依次选取它前面的 \(0\) 个、\(1\) 个、\(2\) 个数……

所以,如果 \(a_i\)\(a_{i + 1}\) 组成的两位数可以被 \(4\) 整除,则一共有 \(i\) 种选法。统计答案的时候都加起来即可。

形式化地,有答案

\[Ans = \sum_{i = 1}^{n - 1}[(a[i] * 10 + a[i+1]) \% 4]\times i+\sum_{i=1}^{n}[a[i]\%4] \]

其中,\(a[i]\) 表示 \(s[i]\) 构成的整数中,第 \(i\) 位的数字。


C. Bear and String Distance

Link-CF
Link-Luogu

【题目大意】

给出如下定义:

  • \(num(c_0)\)。其中,\(c_0\) 是一个字符,\(num(c_0)\) 定义为 \(c_0\) 在小写字母表的位置。

  • \(dis(c_1, c_2)\)。其中,\(c_1\)\(c_2\) 都是字符。\(dis(c_1, c_2) = \lvert num(c_1) - num(c_2) \rvert\)

  • \(dist(s, s^{\prime})\)。其中 \(s\)\(s^{\prime}\) 都是长度为 \(n\) 字符串。\(dist(s, s^{\prime}) = \sum_{0}^{n - 1} dis({s}_i, {s^{\prime}}_i)\)

给定一个长度为 \(n\) 的字符串 \(s\),给定一个正整数 \(k\)。要求构造出一个长度 \(n\) 的字符串 \(s^{\prime}\),使得 \(dist(s, s^{\prime})\) = \(k\),输出这个 \(s^{\prime}\)。如果不存在这样的 \(s^{\prime}\) 输出 -1

注意字符串从 \(0\) 开始编号,末尾编号为 \(n - 1\)

【解题思路】

考虑贪心。

显然,\(dis(c_1, c_2)\) 为两个字符在字母表中的距离。容易知道,如果 \(c_1\) 为定字符,\(c_2\)az 时,\(dis(c_1, c_2)\) 最大。容易知道这时候 \(dis(c_1, c_2)\) 的最大值和取到最大值的时候 \(c_2\) 的字符。

所以说,我们能求出 \(dist(s, s^{\prime})\) 的最大值。

形式化地,我们有如下定义:

\[m_i := \max(num(s_i) - 1, 26 - num(s_i)), \]

\[x_i := \begin{cases} 1, & m_i =s_i-1\\ 26, & otherwise. \end{cases} \]

\[sum_i := \sum_{j = 0}^{n - 1} m_i \]

可以知道,当 \(sum_{n - 1} < k\) 时,就算在取到最大值时也不足 \(k\),这样无论如何都不能达到 \(k\),所以输出 -1

考虑构造。

显然这时候 \(k \leq sum_{n - 1}\)。这里给出一种构造方案:

对于满足 \(sum_i < k\)\(i\),直接使 \(s_i^{\prime}\) 为第 \(x_i\) 位的字母。这时,\(dis(s_i, s_i^{\prime}) = m_i\)

对于满足 \(k \leq sum_i\) 的最小的 \(i\),若 \(x_i = 1\),则 \(s_i^{\prime}\) 为第 \(num(s_i) - k + sum_{i - 1}\) 的字母;若 \(x_i = 26\),则 \(s_i^{\prime}\) 为第 \(num(s_i) + k - sum_{i - 1}\) 的字母。容易证明,\(dis(s_i, s_i^{\prime}) = k - sum_{i - 1}\) 且上面两个数均大于 \(0\)。令 \(p = i\)

对于满足 \(k \leq sum_i\) 的且不是最小的 \(i\),则 \(s_i^{\prime} = s_i\)。这时,\(dis(s_i, s_i^{\prime}) = 0\)

这样,有 \(dist(s, s^{\prime}) = k\)

证明:

\[\begin{aligned} dist(s, s^{\prime}) &= \sum_{i = 0}^{p-1}dis(s_i, s_i^{\prime})+dis(s_p,s_p^{\prime})+\sum_{i=p+1}^{n-1}dis(s_i, s_i^{\prime}) \\ &= \sum_{i = 0}^{p-1}m_i+k-sum_{p-1} \\ &= sum_{p-1} + k - sum_{p - 1} \\ &= k \end{aligned} \]

这样,就构造出满足条件的 \(s^{\prime}\) 了。


后三个题太难,咕了。

posted @ 2024-10-30 14:35  Eliauk_FP  阅读(174)  评论(1编辑  收藏  举报