Codeforces Round 910 (Div. 2)

Codeforces Round 910 (Div. 2)

💡 原文中文,约4800字,阅读约需12分钟。
📝

内容提要

给定一个由A和B组成的字符串,找到将字符串转换为所需模式所需的最小操作次数。解决方案涉及计算字符串中B的数量,并将其与所需模式进行比较。如果计数匹配,则不需要操作。否则,迭代字符串并调整计数直到匹配所需模式。

🔎

延伸解读

从后往前拆分的贪心逻辑

B题要求通过拆分数组元素使其非递减,题解采用从后往前遍历的策略:当当前元素大于后一个元素时,将其均匀拆分成若干份,使拆分后的最大值不超过后一个元素。这种贪心方式能保证拆分次数最少,因为每次拆分都尽可能保留较大的值,避免过度拆分。代码中通过计算 cut = data[i] / data[i+1] + (data[i] % data[i+1] == 0 ? 0 : 1) 来确定份数,并累加 cut-1 作为操作次数。

棋盘染色的构造与边界情况

C题要求在棋盘边上染色,使从左上到右下的某条路径长度恰好为k且红蓝间隔。题解指出,由于可以重复经过点,可以利用4步的环来调整路径长度,因此k必须满足 k >= 最短距离 且 (k - 最短距离) 为偶数。对于2x2的特殊棋盘,需要单独处理,仅当k%4==2时可行。构造时根据长边方向选择不同的初始染色模板,再补充路径,确保红蓝交替。

交换b数组元素以最大化绝对差之和

D题允许交换b数组中的两个元素一次,使得 sum |a_i - b_i| 最大。题解通过交换使每个a_i <= b_i(不影响结果),然后分析发现只有交换后形成交叉(即a_j > b_i)才能增加总和,增加量为 2*(a_j - b_i)。因此只需找到最大的a_j和最小的b_i,计算 max(0, 2*(a_j - b_i)) 并加到原总和上。代码中先交换使a_i <= b_i,再遍历找到最大a和最小b,最后输出结果。

❓

Q&A

Codeforces Round 910 Div.2 的 A 题要求做什么?

给定一个由 A 和 B 组成的字符串,每次操作可以选择前 n 个字母并将它们全部变成 A 或全部变成 B,问最少需要多少次操作才能使字符串中恰好有 k 个 B。

B 题中如何用最少的拆分次数让数组非递减?

从后往前遍历数组,如果当前元素大于后一个元素,则将其均匀拆分成 x 份,使得拆分后的最大值不超过后一个元素,拆分次数为 x-1,累加所有拆分次数即为答案。

C 题 Colorful Grid 中,路径长度 k 需要满足什么条件?

路径长度 k 必须至少为最短距离 (n-1)+(m-1),且 k 与最短距离的差值必须为偶数;此外,对于 2x2 的棋盘,k 必须满足 k%4==2。

D 题 Absolute Beauty 中,交换 b 数组两个元素后,如何最大化绝对差之和?

首先通过交换使得每个 a_i ≤ b_i,然后计算初始绝对差之和,再找到最大的 a_j 和最小的 b_i,答案加上 2*(a_j - b_i) 与 0 的较大值。

E 题中允许对字符串 a 进行哪两种操作?

允许选择任意片段进行排序,或者删除一个指定的字符,操作次数不限。

E 题中如何判断字符串 a 能否变成 b?

遍历 b 的每个字符,在 a 中找到当前可用的最小位置,并将该位置之前比当前字符大的字符移动到后面或删除,若所有字符都能匹配则可行。

🏷️

标签

➡️

继续阅读