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]),我们取这范围出现次数最多的数保留下来,其他数都修改掉

原文地址:https://www.cnblogs.com/Dup4/p/11525791.html