期望分数 / 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;
}