Luogu_P1365 WJMZBMR打osu! 期望

Luogu_P1365 WJMZBMR打osu!

期望


题目链接
题意很容易理解
设之前的连续的'o'个数已经为\(x\)
这次也为'o'
\((x+1)^2-x^2=2*x+1\)
那么每次的成功的贡献就是\(2*x+1\)
假如只有'o'和'x'就很好解决了
但是还有'?'求期望
就设\(p[i]\)为当前这位成功的概率
明显'o'就是\(p[i]=1\)
'x'就是\(p[i]=0\)
'?'就是\(p[i]=0.5\)
那就把每次的贡献乘\(p[i]\)就是每次的期望贡献了


代码如下:
(不要忘记上面的\(x\)是上一位的\(x\),所以在写的时候应该是\((2*x[i-1]+1)*p[i]\)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n;
double p[maxn],f[maxn],x[maxn];
string s;
int main()
{
    scanf("%d",&n);cin>>s;
    for(int i=0;i<n;i++){
        if(s[i]=='o') p[i+1]=(double)1.0;
        if(s[i]=='x') p[i+1]=(double)0.0;
        if(s[i]=='?') p[i+1]=(double)0.5;
    }
    for(int i=1;i<=n;i++){
        f[i]=f[i-1]+(2.0*x[i-1]+1.0)*p[i];
        x[i]=(x[i-1]+1.0)*p[i];
    }
    printf("%.4lf\n",f[n]);
    return 0;
}
posted @ 2019-10-21 10:23  ChrisKKK  阅读(72)  评论(0编辑  收藏  举报