Codeforces Round 939 (Div. 2)

💡 原文中文,约2100字,阅读约需5分钟。
📝

内容提要

这篇文章解答了四个问题:士兵排队、一组牌的游戏、矩阵问题和数组操作。

🔎

延伸解读

题目A的简化思路

题目A中,士兵按顺序报数,每次报到给定位置a_i的士兵被踢出。由于只需要关注第一个被踢出的位置,后续的踢出操作不会影响剩余人数。因此,对于每个查询n,最后剩下的士兵数量为min(n, s-1),其中s是第一个被踢出的位置。这一观察大大简化了问题,避免了模拟整个过程的复杂性。

题目B的得分策略

题目B中,每种数字恰好有两张牌,分给两名玩家。先手出牌时,如果后手有相同数字的牌,后手可以立即出牌得分。因此,先手只能通过自己手中拥有两张相同数字的牌来得分,因为这样后手无法配对。所以最大得分等于手牌中重复数字的对数,即n减去不同数字的个数。

题目C的矩阵构造

题目C允许通过覆盖行或列来构造矩阵,每次覆盖写入1到n的排列。最终每个位置的值可以变为其行号和列号中的较大者。因此,矩阵的总和可以通过计算所有位置的max(i, j)+1之和得到。构造方案需要2n次操作,从最后一行开始,依次覆盖行和列,确保每个位置达到最大值。

题目D的动态规划与递归

题目D中,数组长度最多为18,允许暴力求解。通过动态规划确定哪些区间应该进行操作,使得最终区间内的所有值变为区间长度。例如,长度为5的区间可以变为五个5。递归构建时,先构造0到4的序列,然后通过一次MEX操作得到五个5,再重复构建过程。这样,可以最大化数组的总和。

❓

Q&A

士兵排队问题的主要思路是什么?

只需要关注第一个被踢出去的人即可计算最后剩下的士兵数量。

如何计算牌的游戏中最多可以获得的分数?

先手只能赚到那些两张牌都在自己手里的分数,因此可以通过计算手牌的独特数字来得出分数。

矩阵问题的求和方法是什么?

每个位置可以变成其横坐标和纵坐标中的较大者,通过简单模拟可以计算最终矩阵的总和。

MEX操作在数组操作中如何最大化数组和?

可以通过选择子串并将其值变成该子串的MEX,最终使整个数组的所有位置之和最大化。

士兵排队问题的输入格式是什么?

输入包括士兵数量、踢出位置的数量和踢出位置的具体值。

在牌的游戏中,如何处理手牌的输入?

输入包括手牌的数量和每张牌的具体值,使用集合来存储独特的牌。

🏷️

标签

➡️

继续阅读