题意:
某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(
我们来简化一下这个游戏的规则
有
n
n
n次点击要做,成功了就是
o
o
o,失败了就是
x
x
x,分数是按comb计算的,连续
a
a
a个comb就有
a
∗
a
a*a
a∗a分,comb就是极大的连续
o
o
o。
比如
o
o
x
x
x
x
o
o
o
o
x
x
x
ooxxxxooooxxx
ooxxxxooooxxx,分数就是
2
∗
2
+
4
∗
4
=
4
+
16
=
20
2*2+4*4=4+16=20
2∗2+4∗4=4+16=20。
Sevenkplus闲的慌就看他打了一盘,有些地方跟运气无关要么是
o
o
o要么是
x
x
x,有些地方
o
o
o或者
x
x
x各有
50
50%
50的可能性,用
?
?
?号来表示。
比如
o
o
?
x
x
oo?xx
oo?xx就是一个可能的输入。
那么WJMZBMR这场osu的期望得分是多少呢?
比如
o
o
?
x
x
oo?xx
oo?xx的话,
?
?
?是
o
o
o的话就是oooxx => 9,是x的话就是ooxxx => 4
期望自然就是(4+9)/2 =6.5了
题解:
将平方差分
(
x
+
1
)
2
−
x
2
=
2
x
+
1
(x+1)^2-x^2=2x+1
(x+1)2−x2=2x+1
那么就将平方转化成加法,维护当前连续期望
o
o
o的个数即可。
code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
double ans=0.0,p=0.0;
int n;
char s[300010];
int main()
{
scanf("%d",&n);scanf("%s",s+1);
for(int i=1;i<=n;i++)
{
if(s[i]=='x') p=0.0;
if(s[i]=='o') ans+=2*p+1,p=p+1;
if(s[i]=='?') ans+=p+0.5,p=(p+1)/2;
}
printf("%.4lf",ans);
}