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; }