Loading

Codeforces Educational Round

代码部队教育回合

176-2075

B(1300)

这都不会了?原来是被 corner case 坑了。 当 \(k=1\) 时要特殊处理。

174-2069

Edu 174E - A, B, AB and BA(2300)

本题旨在考察选手的分讨能力和耐心。

容易想到,由于不能有相邻相同,所以在 AABB 中间断开,将序列分为四种:

  1. ABABAB...B

  2. BABABA...A

  3. ABABA...A

  4. BABAB...B

到这里就需要考虑怎样贪心使用每一种组,使其更优了。直接考虑其实并不容易,我在这里使用了错误的贪心策略。

正确的策略可以考虑:单个 \(a\) 和单个 \(b\) 肯定尽量少用,因为这两种比较万能。一开始假定每一个组都只有一个字符,那么要求 \(cnt_a\le a\)\(cnt_b\le b\) 满足。

现在有了 ABBA 这种分组方式,就可以将一些东西合并。一次合并之后 A 能减少 1B 也能减少 1

对于第三种和第四种,都是好的,因为这两种无论如何都能合并成 ABBA,且合并完之后仍然形式不变。但是对于第一种和第二种,例如第一种,假如其长度为 \(l\),如果全是 AB,能拼成 \(\frac{l}{2}\) 个,但如果出现了一个 BA,就只能拼成 \(\frac{l}{2}-1\) 个。如果在长的串中用了 AB,那么就会有很多短的串中出现 BA,这不优。所以将第一种串排序,先填小的串,使得尽可能多个串不被浪费。第二种串同理。填完之后再考虑第三种和第四种,最后判断一下剩下的单独 A 的个数和单独 B 的个数是否满足 \(a\)\(b\) 的限制即可。

173-2043

Edu 173E - Matrix Transformation(2300)

没多久就想到了,但是一直 WA on Test 2,感觉我的方法没问题,为啥一直过不了?看了题解发现和题解做法不同,题解做法我曾经考虑过,但是感觉还是比较麻烦。然后拷了题解代码对拍,找不到差异。最后突然发现是判断的时候,a 数组没有取出某一位。

首先显然拆位。正着做不好做,将这个过程倒过来。最后一次操作形如将某一行全部赋为 0 或是将某一列全部赋为 1。那么如果 b 矩阵中某一行全部为 0,就可以最后进行将这行全部赋为 0 的操作,那么之前这一行的值是什么就无所谓了。不妨将这一行的值视为 -1,即可以是 0 也可以是 1,再不断找全为 0 的行或全为 1 的列,最后再判断与 a 矩阵是否相同。正确性显然。

170-2025

Edu 170E - Card Game(2200)

怎么感觉这么水,还做了半个小时,速度真是慢。

直接 DP。由于玩家 A 必须所有牌都强于玩家 B,而除了第一行以外每一行的牌只能强于本行前面的,所以 2 到 \(n\) 行是独立且相同的。对于每一行 DP,设 \(f_{i,j}\) 表示某一行前 \(i\) 列填完了,玩家 B 比玩家 A 多 \(j\) 张牌的方案数,要保证每个时刻 \(j\ge 0\),否则 A 会多出一些赢不了的牌。

然后再用一个背包将单行的 \(f\) 合并成多行的,得到 \(g_i\) 表示在 2 到 \(n\) 行,B 总共比 A 多了 \(i\) 张牌的方案数。这 \(i\) 张牌要在第一行夺回来。设 \(h_{i,j,k}\) 表示第 1 行,填了前 \(i\) 列,B 比 A 多 \(j\) 张牌,还有 \(k\) 张牌要夺回来。那么当 \(j=0\) 时,可以转移到 \(k-1\),否则可以转移到 \(j+1\)\(j-1\)。最后答案是 \(h_{m,0,0}\),可以滚动一下数组。

反正 \(n,m\le 500\),这怎么做都能过吧。

posted @ 2025-02-27 06:48  Terminator-Line  阅读(23)  评论(0)    收藏  举报