[置顶] Codeforces Round #190 (Div. 2)(完全)

时间:2023-03-09 18:43:19
[置顶] Codeforces Round #190 (Div. 2)(完全)

好久没有写博客了,一直找不到有意义的题可以写,这次也不算多么有意义,只是今天是比较空的一天,趁这个时候写一写。


A.

B.

有一点贪心,先把每个拿去3的倍数,余下0或1或2,然后三个一起拿。

对于以上的做法我们少考虑了一种情况:

即 a,b,c三个数对3取模以后为2 2 0

假如 c >= 3,   那么  我把c拿得只剩 3, 那么 2 2 3 可以拿2次, 而 以上的贪心只能拿1次。

所以这种情况还要加上一次

code


C.

先算出1个字符串周期分别在x,y方向上走了xx,yy步

所以它能到达的点必定是   Kxx+x0, Kyy+y0, (x0, y0)是一个字符串内能走到的所有点(K是非负数)。

所以我们就是要看看某个方程 a = Kxx+x0, b = Kyy+y0。只要有一个(x0, y0)让方程的K有解,那么Yes

否则No,这里我们要注意 当xx == 0时 a == x0情况下K的解才是任意非负数,同理yy也一样。

code


D.

我用贪心解的,考虑2种情况。假设两人的编号为A,B。A一直是atk的。

1.不能能把全部的def,atk打完。 这时我们不必管def,A从大到小排,B的atk从小到大排, A每次拿最大的去打B最小的(要能打赢才能算分) 即可。

2.能把全部的def,atk打完。  这时我们先必须打def,A从小到大排, B的def从小到大排,用A最小的去打B最小的(要能就打掉,不能就保存下来A)。然后剩下来的A(已经是从小到大的顺序),B的atk从小到大排,用A最小的去打B最小的(要能打赢才能算分,不能打掉的放到最后全打完以后打),  这里要注意 要判 def 和atk是否打完。

code


E.

适当分析一下,题目必然有解。

我的做法是 从叶子到根往上放。每个节点保存 它要放的字符和 以它为根的子树中 各个字母的有效总数

后一个信息的解释:

1.对于每个叶子我们都放Z,那么假如  有这么一颗树( u,v1,v2,v3), v1,v2,v2已经都放Z, 那么u就放Y,

那么对于 v1, v2,v3的3个Z考虑与否就不会影响往上放的时候的字母。v1,v2,v3这3个Z是无效的

2.相反, 有这么一颗树( u,v)  v放Y,u放Z 那么下面的v是会影响往上放的时候的字母。v这个Y是有效的。

那么我们只要模拟这两种情况即可。对于每个子树的根u,有( u,v1,v2,v3,....),我们通过 “以u为根的子树中 各个字母的有效总数”这一信息来确定u要放什么字母。下面 所说的字母总和都是指有效字母。

先找出 字母总和 >= 2的最小的字母(下标k,字母标号0-----25)。然后从k----0的顺序找第一个   字母总和为0的字母。这个字母就是要放的字母。   假如有  C:1  D:2  Z:  2 这种情况我们放B ,假如有  B:1  D:2  Z:  2 这种情况我们放C, 然后我们还要清除失效的字母总和, 很显然对于  k的字母总和就为1, k+1------25就被清除了,都为0。

code