描述
原题在这: https://codeforces.com/problemset/problem/399/B
给一个用字符串表示的栈, R
表示红球, B
表示蓝球. 按照以下规则按顺序操作(循环), 直到不含B
:
- 如果栈顶是
R
,持续pop - 如果栈顶是
B
, 替换成R
- 如果栈不满, 补上
B
直到栈满
思路
乍一看是一道简单的implement的题, 于是单纯的implement一下, TLE.
观察(或者手算):
- 最终状态必然是
RRRRRR
这种. - 如果当前栈顶连续的
B
只有一个, likeRRRRRB
, 那么本轮完成后是RRRRRR
. 过渡到结束点用了1
步. - 如果当前栈顶是两个连续的
B
, likeRRRRBB
, 那么状态会是RRRRBR
->RRRRRB
-> (第一种情况). 过渡到第一种情况用了2
步. - 如果当前栈顶是三个连续的
B
, likeRRRBBB
, 状态分别是RRRBBR
->RRRBRB
->RRRBRR
->RRRRBB
-> (第二种情况). 过渡到第二种情况用了4
步. - 归纳可知对于末尾连续
n
个B
, 会给结果带来2^n - 1
的贡献.
代码
1 | def do(): |