CF399B Red and Blue Balls 题解
分析
本题暴力解法会 TLE,所以我们需要进一步分析。
定义状态 \(a_i\) 表示把前 \(i\) 个球全部变为红色的步数,那么如果第 \(i\) 个球是蓝色的话,我们需要做如下操作:
-
把前 \(i-1\) 个球弹出;
-
把第 \(i\) 个球变成红色;
-
把第 \(i\) 个球前面填上蓝色球。
显然,既然取到了第 \(i\) 个球,那这个球前面的一定都是红球,需要 \(a_{i-1}\) 次转换,那么转移方程如下:
\[a_i=\begin{cases}1,&i=1,\\\sum\limits_{j=1}^{i-1}a_{j}+1,&i\ge2.\end{cases}
\]
最后,统计:
\[\sum_{i=1,s_i=\texttt{B}}^{n}a_i
\]
就是最终的答案。其中 \(s_i\) 表示第 \(i\) 个球的颜色。
代码实现
#include <bits/stdc++.h>
using namespace std;
long long a[55];
int n;
char s[55];
int main(){
cin>>n>>s+1;
a[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++)a[i]+=a[j];
a[i]++;
}
long long ans=0;
for(int i=1;i<=n;i++)if(s[i]=='B')ans+=a[i];
cout<<ans;
//system("pause");
}

浙公网安备 33010602011771号