期望分数 / OSU!
题目链接:ybt金牌导航1-1-4 / luogu P1654
题目大意
一共有 n 次操作,每次操作只有成功与失败之分,成功对应 1,失败对应 0,n 次操作对应为 1 个长度为 n 的 01 串。在这个串中连续的 X 个 1 可以贡献 X^3 的分数。
现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留1位小数。
思路
这道题其实跟上一题很像,就只是概率变的更多,而且这次是 x 3 x^3 x3。
那我们首先来看如何搞
x
3
x^3
x3 跟
(
x
+
1
)
3
(x+1)^3
(x+1)3 差了多少。
(
x
+
1
)
3
=
(
x
+
1
)
2
×
(
x
+
1
)
=
(
x
2
+
2
x
+
1
)
×
(
x
+
1
)
=
x
3
+
3
x
2
+
3
x
+
1
(x+1)^3=(x+1)^2\times(x+1)=(x^2+2x+1)\times(x+1)=x^3+3x^2+3x+1
(x+1)3=(x+1)2×(x+1)=(x2+2x+1)×(x+1)=x3+3x2+3x+1
那就是多了
3
x
2
+
3
x
+
1
3x^2+3x+1
3x2+3x+1。
那我们就每次弄出
x
x
x 和
x
2
x^2
x2,然后就可以根据这个得出答案了。
(
x
2
x^2
x2 每次加的就是
2
×
x
+
1
2\times x + 1
2×x+1)
代码
#include<cstdio>
using namespace std;
int n;
double a[100001], ans, two[100001], one[100001];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lf", &a[i]);
one[i] = (one[i - 1] + 1.0) * a[i];//得出新的x
two[i] = (two[i - 1] + 2.0 * one[i - 1] + 1.0) * a[i];//得出新的x^2
ans += (3.0 * two[i - 1] + 3.0 * one[i - 1] + 1.0) * a[i];//算增加的答案:3*x^2+3*x+1
}
printf("%.1lf", ans);
return 0;
}