1. 程式人生 > 其它 >CF399B Red and Blue Balls 題解

CF399B Red and Blue Balls 題解

題目傳送門

分析

本題暴力解法會 TLE,所以我們需要進一步分析。

定義狀態 \(a_i\) 表示把前 \(i\) 個球全部變為紅色的步數,那麼如果第 \(i\) 個球是藍色的話,我們需要做如下操作:

  1. 把前 \(i-1\) 個球彈出;

  2. 把第 \(i\) 個球變成紅色;

  3. 把第 \(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");
}