原题传送门
这题还是有一点难度的
仿照刚做过的很像的一道题
令
g
i
表
示
当
前
连
续
成
功
期
望
长
度
,
f
i
表
示
当
前
期
望
得
分
g_i表示当前连续成功期望长度,f_i表示当前期望得分
gi表示当前连续成功期望长度,fi表示当前期望得分
得到:
f
i
=
(
g
i
−
1
+
1
)
3
∗
p
i
=
g
i
−
1
3
∗
p
i
+
(
3
g
i
−
1
2
+
3
g
i
−
1
)
∗
p
i
=
f
i
−
1
+
(
3
g
i
−
1
2
+
3
g
i
−
1
)
∗
p
i
f_i=(g_{i-1}+1)^3*p_i=g_{i-1}^3*p_i+(3g_{i-1}^2+3g_{i-1})*p_i=f_{i-1}+(3g_{i-1}^2+3g_{i-1})*p_i
fi=(gi−1+1)3∗pi=gi−13∗pi+(3gi−12+3gi−1)∗pi=fi−1+(3gi−12+3gi−1)∗pi
现在目标把
g
i
2
和
g
i
表
示
出
来
g_i^2和g_i表示出来
gi2和gi表示出来
令
x
1
i
表
示
g
i
的
期
望
,
x
2
i
表
示
g
i
2
的
期
望
x1_i表示g_i的期望,x2_i表示g_i^2的期望
x1i表示gi的期望,x2i表示gi2的期望
得到最终方程:
x
1
i
=
p
i
(
x
1
i
−
1
+
1
)
x1_i=p_i(x1_{i-1}+1)
x1i=pi(x1i−1+1)
x
2
i
=
p
i
(
x
2
i
−
1
+
2
x
1
i
−
1
+
1
)
x2_i=p_i(x2_{i-1}+2x1_{i-1}+1)
x2i=pi(x2i−1+2x1i−1+1)
f
i
=
f
i
−
1
+
p
i
(
3
x
2
i
−
1
+
3
x
1
i
−
1
+
1
)
f_i=f_{i-1}+p_i(3x2_{i-1}+3x1_{i-1}+1)
fi=fi−1+pi(3x2i−1+3x1i−1+1)
再发现:可以顺手滚掉以为,直接用变量转移即可,不过要稍稍换一下转移顺序
Code:
#include <bits/stdc++.h>
using namespace std;
int n;
double f, x1, x2, p;
int main(){
scanf("%d", &n);
for (int i = 1; i <= n; ++i){
scanf("%lf", &p);
f = f + p * (3 * x2 + 3 * x1 + 1);
x2 = p * (x2 + 2 * x1 + 1);
x1 = p * (x1 + 1);
}
printf("%.1lf\n", f);
return 0;
}

博客针对LuoGu上一道有难度的题目给出题解。仿照类似题目,令gi表示当前连续成功期望长度,fi表示当前期望得分,推导出相关方程。还令x1i、x2i分别表示gi和gi2的期望,得到最终方程,且可通过变量转移求解。
3133

被折叠的 条评论
为什么被折叠?



