传送门
题目大意
一个栈内初始有
n
n
n个红色和蓝色的小球,请你按照以下规则进行操作
1
1
1.只要栈顶的小球是红色的,将其取出,直到栈顶的球是蓝色
2
2
2.然后将栈顶的蓝球变成红色
3
3
3.最后放入若干个蓝球直到栈中的球数为
n
n
n
以上
3
3
3步骤为一次操作 如栈中都是红色球,则操作停止,请问几次操作后停止 ainta出完题发现他自己不能
A
C
AC
AC所以想请你帮忙
R
R
R代表红色,
B
B
B代表蓝色
思路
假设第i个球是蓝色,他变成红色对后面的蓝球没有影响
先做一遍模拟
1.将栈顶的所有红色球取出
2.将此时栈顶的蓝色球变成红色
3.用蓝色球填满空缺
可以发现:找到的第一个蓝球前的所有红球全变蓝了,而这个蓝球变成了红球
所以第i个蓝色球想出栈,等效于先走一步“x位置红,[1,i-1]位置蓝”,再让[1,i-1]依次出栈
f
(
i
)
=
f
(
1
)
+
f
(
2
)
+
f
(
3
)
+
.
.
.
+
f
(
i
−
2
)
+
f
(
i
−
1
)
+
1
f(i)=f(1)+f(2)+f(3)+...+f(i-2)+f(i-1)+1
f(i)=f(1)+f(2)+f(3)+...+f(i−2)+f(i−1)+1(
i
i
i位置是蓝色球)
f
(
i
−
1
)
=
f
(
1
)
+
f
(
2
)
+
f
(
3
)
+
.
.
.
+
f
(
i
−
3
)
+
f
(
i
−
2
)
+
1
f(i-1)=f(1)+f(2)+f(3)+...+f(i-3)+f(i-2)+1
f(i−1)=f(1)+f(2)+f(3)+...+f(i−3)+f(i−2)+1
所以
f
(
i
)
=
[
f
(
i
)
+
f
(
2
)
+
.
.
.
+
f
(
n
−
2
)
+
1
]
+
f
(
i
−
1
)
f(i)=[f(i)+f(2)+...+f(n-2)+1]+f(i-1)
f(i)=[f(i)+f(2)+...+f(n−2)+1]+f(i−1)
即
f
(
i
)
=
2
∗
f
(
i
−
1
)
f(i)=2*f(i-1)
f(i)=2∗f(i−1)
所以
a
n
s
=
∑
i
f
s
[
i
]
=
=
B
(
2
i
−
1
)
ans=\sum_{if\ s[i]==B}(2^{i-1})
ans=∑if s[i]==B(2i−1)
代码
int n,st[51];
char a[51];
ll ans;
int main()
{
scanf("%d",&n);
scanf("%s",a);
for(int i=1;i<=n;i++)
if(a[i-1]=='R')st[i]=1;
else st[i]=2;
for(int i=1;i<=n;i++)if(st[i]==2)ans+=qpow(i);
printf("%lld",ans);
return 0;
}