Let’s play OSU
本题和OSU很像 ——升级版
首
先
,
老
套
路
,
定
义
f
[
i
]
为
长
度
为
i
的
连
续
个
数
的
期
望
,
a
n
s
[
i
]
表
示
长
度
为
i
,
平
方
的
期
望
首先,老套路,定义f[i]为长度为i的连续个数的期望,ans[i]表示长度为i,平方的期望
首先,老套路,定义f[i]为长度为i的连续个数的期望,ans[i]表示长度为i,平方的期望
我
们
发
现
,
f
[
i
]
=
∑
x
x
∗
p
=
∑
x
∑
i
=
1
x
p
(
长
度
为
x
的
概
率
)
我们发现,f[i]=\sum \limits_{x}x*p=\sum\limits_{x}\sum\limits_{i=1}^xp(长度为x的概率)
我们发现,f[i]=x∑x∗p=x∑i=1∑xp(长度为x的概率)
a
n
s
[
i
]
=
∑
x
x
2
∗
p
(
长
度
为
x
的
概
率
)
ans[i]=\sum \limits_{x}x^2*p(长度为x的概率)
ans[i]=x∑x2∗p(长度为x的概率)即从i前随机抽取两个的方案数(可重)
——————————————————————————————————————
a
n
s
[
i
]
=
a
n
s
[
i
−
1
]
(
两
个
都
从
前
面
抽
并
且
不
一
定
连
续
)
+
2
∗
f
[
i
−
1
]
∗
p
[
i
]
(
从
前
面
抽
一
个
,
这
一
个
必
抽
,
无
序
,
所
以
乘
2
)
+
1
∗
p
[
i
]
ans[i]=ans[i-1](两个都从前面抽并且不一定连续)+2*f[i-1]*p[i](从前面抽一个,这一个必抽,无序,所以乘2)+1*p[i]
ans[i]=ans[i−1](两个都从前面抽并且不一定连续)+2∗f[i−1]∗p[i](从前面抽一个,这一个必抽,无序,所以乘2)+1∗p[i]
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;
double f[N],ans[N],p[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){scanf("%lf",&p[i]);}
for(int i=1;i<=n;i++){
f[i]=(f[i-1]*p[i])+1*p[i];
ans[i]=ans[i-1]+2*f[i-1]*p[i]+1*p[i];
}
printf("%.15f",ans[n]);
}