Luogu_P1365 WJMZBMR打osu! 期望

末鹿安然 提交于 2019-12-01 18:26:59

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!