淘先锋技术网

首页 1 2 3 4 5 6 7

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