高次数学期望—OSU

高次数学期望—OSU

OSU!

题目描述

osu 是一款群众喜闻乐见的休闲软件。

我们可以把 osu 的规则简化与改编成以下的样子:

一共有 n 次操作,每次操作只有成功与失败之分,成功对应 1,失败对应 0n 次操作对应为 1 个长度为 n 的 01 串。在这个串中连续的 X1 可以贡献 X3 的分数,这 x1 不能被其他连续的 1 所包含(也就是极长的一串 1,具体见样例解释)

现在给出 n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留 1 位小数。

输入格式

第一行有一个正整数 n,表示操作个数。接下去 n 行每行有一个 [0,1] 之间的实数,表示每个操作的成功率。

输出格式

只有一个实数,表示答案。答案四舍五入后保留 1 位小数。

样例 #1

样例输入 #1

3 
0.5 
0.5 
0.5

样例输出 #1

6.0

提示

【样例说明】

000 分数为 0001 分数为 1010 分数为 1100 分数为 1101 分数为 2110 分数为 8011 分数为 8111 分数为 27,总和为 48,期望为 488=6.0

n1×105

题解

由于涉及三次方,于是:

E(x+1)3=E(x)3+3E(x)2+3E(x)+1

这启发我们维护二次幂和一次式的期望进行递推。由于算上这部分期望是第x+1位为1的情况,所以我们设fi,gi分别表示当第i位为1时候所得的一次方和二次方的期望得分,则容易得到:

fi=(fi1+1)pi

gi=(gi1+2fi1+1)pi

则不难递推出答案:设前i位的期望得分是hi,则有:

hi=(hi1+3gi1+3fi1+1)pi+(1pi)hi1

得到代码:

#define db double 
int n;
db f,g,h,f1,g1,h1,p;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>p;
		f=(f1+1.0)*p;
		g=(g1+2.0*f1+1.0)*p;
		h=h1+(3.0*g1+3.0*f1+1.0)*p;
		f1=f,g1=g,h1=h;
	}
	printf("%.1f",h);
} 
posted @   spdarkle  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示