这两道题是一样的......
我就说一下较难的那个 OSU!:
这道15行的水题我竟然做了两节课......
若是f[i][0]=(1-p)*f[i-1][0]+(1-p)*f[i-1][1],f[i][1]=p*(f[i-1][0]+1.0)+p*(f[i-1][1]+OOXX);
我们合并一下f[i]=p*1.0+p*OOXX=p*OX;
OX:就是期望x^3的差,也就是(x+1)^3=x^3+3*x^2+3*x+1.0,中的3*x^2+3*x+1.0,这样我们要维护x^2以及x注意这里的x^2和x是指结尾的长度x
#include<cstdio> double f,p,X2,X1; int n; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lf",&p); f+=p*(3.0*X2+3.0*X1+1.0); X2=p*(X2+2.0*X1+1.0); X1=p*(X1+1.0); } printf("%.1lf",f); }
下面给一下Easy的代码
#include<cstdio> #include<cstring> using namespace std; char s[300010]; double ans,X,now; int len; int main() { scanf("%d%s",&len,s); for(int i=0;i<len;i++) { if(s[i]=='?')now=0.5; else if(s[i]=='o')now=1.0; else now=0.0; ans+=now*(2.0*X+1.0); X=now*(X+1.0); } printf("%.4lf",ans); return 0; }