代码部队教育回合
Edu 174E - A, B, AB and BA(2300)
本题旨在考察选手的分讨能力和耐心。
容易想到,由于不能有相邻相同,所以在 AA
和 BB
中间断开,将序列分为四种:
-
ABABAB...B
-
BABABA...A
-
ABABA...A
-
BABAB...B
到这里就需要考虑怎样贪心使用每一种组,使其更优了。直接考虑其实并不容易,我在这里使用了错误的贪心策略。
正确的策略可以考虑:单个 \(a\) 和单个 \(b\) 肯定尽量少用,因为这两种比较万能。一开始假定每一个组都只有一个字符,那么要求 \(cnt_a\le a\) 且 \(cnt_b\le b\) 满足。
现在有了 AB
和 BA
这种分组方式,就可以将一些东西合并。一次合并之后 A
能减少 1
,B
也能减少 1
。
对于第三种和第四种,都是好的,因为这两种无论如何都能合并成 AB
或 BA
,且合并完之后仍然形式不变。但是对于第一种和第二种,例如第一种,假如其长度为 \(l\),如果全是 AB
,能拼成 \(\frac{l}{2}\) 个,但如果出现了一个 BA
,就只能拼成 \(\frac{l}{2}-1\) 个。如果在长的串中用了 AB
,那么就会有很多短的串中出现 BA
,这不优。所以将第一种串排序,先填小的串,使得尽可能多个串不被浪费。第二种串同理。填完之后再考虑第三种和第四种,最后判断一下剩下的单独 A
的个数和单独 B
的个数是否满足 \(a\) 和 \(b\) 的限制即可。