Codeforces Round #584
Contest Info
[Practice Link](https://codeforc.es/contest/1209)
Solved | A | B | C | D | E1 | E2 | F | G1 | G2 | H |
---|---|---|---|---|---|---|---|---|---|---|
7/10 | O | O | O | O | Ø | Ø | - | O | - | - |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A. Paint the Numbers
题意:
要给一个序列中每个数\(a_i\)染色,但是要保证同一种颜色的数的\(gcd\)等于这些数中的最小的那个数。问所需的最少颜色数
思路:
排序后,从最小的染起,没染就染,然后标记它的倍数都被染过
B. Koala and Lights
题意:
有\(n\)个灯,每个灯有一个开关的周期,问某一时刻同时亮着的灯的数量最大是多少
思路:
只有\(100\)个灯,并且周期很小,直接暴力标记一下
C. Paint the Digits
题意:
有\(n\)个数\(a_i \in [0, 9]\),现在要给每个数标上\(1\)或者标上\(2\),现在要使得将标上\(1\)的数都按顺序取出来,然后将标\(2\)的数按顺序取出来接在标\(1\)的数的后面。
使得这个序列是一个非递减序列
如果存在这样的方案,输出方案
思路:
考虑标\(2\)的数中最小的数肯定大于等于标\(1\)的数的最大的数。
枚举这个数,然后贪心即可。
D. Cow and Snacks
题意:
有\(n\)个人,有\(k\)个餐品,每个人有两种非常喜爱的餐品,现在每种餐品都有一个,现在要求给\(n\)个人排个顺序,他们轮流去吃这\(k\)个餐品。
餐品吃掉之后就没了, 对于每个人来说,它吃餐品的策略如下:
- 找是否有自己最喜欢的两种餐品,有就吃,如果两个都有,两个都吃
- 如果吃到了,那么他就是快乐的人,否则就是不快乐的。
问如果安排这\(n\)个人的顺序,使得快乐的人尽量多。
思路:
首先,第一个人安排谁其实无所谓,因为安排谁都会吃掉两块。
我们考虑接下来的人中,肯定优先选其中一个最喜爱的餐品被吃掉的人,因为这样不会造成浪费。
瞎\(DFS\)一下即可。
E1. Rotate Columns (easy version)
题意:
有\(n \cdot m\)的矩阵,每一列可以循环移位,问如果移位后使得每一行的最大数之和最大。
\(1 \leq n \leq 4, 1 \leq m \leq 100\)
思路:
考虑最终结果只会在前\(n\)大列中的循环移位中产生,暴力枚举即可。
E2. Rotate Columns (hard version)
题意:
同\(E1\),\(1 \leq n \leq 12, 1 \leq m \leq 2000\)
思路:
考虑最终结果只会在前\(n\)大列中的循环移位中产生,那么\(m\)就只有\(12\)了。
再考虑\(f[mask]\)表示哪些位被确定的状态下的最大值,显然最后的答案为\(f[(1 << n) - 1]\)。
再枚举每一列的循环移位进行转移,假设已经确定了\(mask\),那么可以枚举\(mask\)补集的子集进行覆盖转移
G1. Into Blocks (easy version)
题意:
有\(n\)个数\(a_i\),现在可以修改一些位置的数,使得每一种数最左的位置和最右的位置之间的数都是这个数。
求最小的修改次数。
思路:
考虑每一种数都有一个范围\([l, r]\),表示这个范围的数要相等。
那么将每种数的\([l, r]\)都取出来,合并后。
那么对于每个\([l, r]\),我们取这范围出现次数最多的数保留下来,其他数都修改掉