牛客OI周赛14-普及组 D(数学期望)

题目链接

前三题水题,直接来到第四题

D-Talk

官方题解:

这里说下我的推法,个人感觉比官方题解容易懂

设dp[i]为从i出发到达n+1的期望步数

那么根据题意推出下面这个公式:

f_i=p_i*(f_{i+1}+1)+(1-p_i)*(f_{i-1}+1)

pi的概率成功  所以是乘上f(i+1)+1  这个+1是走了一步,(1-pi)的概率倒退一步

继续化简 把f[i+1]拿到一边去:

\frac{f_i-(1-p_i)*(f_{i-1}+1)}{p_{i}}-1=f_{i+1}

去掉负数:

\frac{f_i+(p_i-1)*(f_{i-1}+1)}{p_{i}}-1=f_{i+1}

去掉括号化简:

\frac{f_i-f_{i-1}+p_i*f_{i-1}+p_{i}-1}{p_i}-1=f_{i+1}

分开后:

\frac{f_{i}-f_{i-1}}{p_i}+f_{i-1}-\frac{1}{p_i}=f_{i+1}

化简得跟官方有点差异,因为官方的dp是正着推的,我是逆着推的,我的答案就是负数,取个绝对值就好了。

我的代码绝对和公式一致的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n;
double a[N],d[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
	for(int i=1;i<=n;i++)
		d[i+1]=d[i-1]-(1.0/a[i])+(d[i]-d[i-1])/a[i];
	d[n+1]=abs(d[n+1]); 
	printf("%.3lf\n",d[n+1]);
	return 0;
}
发布了498 篇原创文章 · 获赞 66 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/104796300