Codeforces 399 B

传送门

题目大意

一个栈内初始有 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(i2)+f(i1)+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(i1)=f(1)+f(2)+f(3)+...+f(i3)+f(i2)+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(n2)+1]+f(i1)
f ( i ) = 2 ∗ f ( i − 1 ) f(i)=2*f(i-1) f(i)=2f(i1)
所以 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(2i1)

代码

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值