题解 P1365 【WJMZBMR打osu! / Easy】

浅色调

2018-08-27 21:31:14

题解

Solution:

  期望题总是贼有意思。

  本题期望combo为o的期望连续长度的平方,所以我们设f[i]表示到了第i位的总期望combo,g[i]表示到了第i位结尾的连续o的期望长度,那么分情况讨论:

  1、当s[i]==x,则f[i]=f[i-1],g[i]=0;

  2、当s[i]==o,则f[i]=f[i-1]+2*g[i-1]+1,g[i]=g[i-1]+1f[i]=f[i-1]+2*g[i-1]+1是因为f[i]=(g[i-1]+1)^2=g[i-1]^2+2*g[i-1]+1\;,\;g[i-1]^2=f[i-1]);

  3、当s[i]==?,则f[i]=f[i-1]+g[i-1]+0.5,g[i]=\frac{g[i-1]+1}{2};

  注意:由于不知道n的范围,不好开数组,但是我们发现转移时当前的状态只与上一次的状态有关,于是直接滚掉就好了。

### 代码: ```cpp /*Code by 520 -- 7.29*/ #include<bits/stdc++.h> #define il inline #define ll long long #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--) using namespace std; int n,cnt; char s; double f[2],g[2]; int main(){ ios::sync_with_stdio(0); cin>>n; For(i,1,n){ cin>>s; if(s=='x') f[cnt^1]=f[cnt],g[cnt^1]=0; else if(s=='o') f[cnt^1]=f[cnt]+2*g[cnt]+1,g[cnt^1]=g[cnt]+1; else f[cnt^1]=f[cnt]+g[cnt]+0.5,g[cnt^1]=g[cnt]/2+0.5; cnt^=1; } printf("%.4lf",f[cnt]); return 0; } ```