题目描述
众所周知,牛可乐 的口胡能力十分强大.牛可乐 要讲 n 件事情,我们把这些事情从 1∼n 标号。牛可乐每讲一件事需要耗费一个单位的时间,但是 牛可乐讲事情和普通人不同:牛可乐在 讲完 第 i 件事时,只有 pi 的概率继续讲下一件事(第 i+1 件),也就是说,牛可乐讲完第 i 件事后有 (1-pi) 的概率从第 i-1 件事开始讲!
当 牛可乐讲完第 n 件事,并且决定讲下一件事时,牛可乐才算是把这 n 件事讲完了。
牛妹是个不耐烦的女孩子,她想问问你 牛可乐期望要讲多久才能把 n 件事情全部讲完。
输入描述:
第一行一个整数 n
第二行 n 个浮点数,代表 pi,保证 p1 = 1
输出描述:
一行一个浮点数,表示 牛可乐期望要多久才能把全部事情讲完(保留到小点后 3 位)
输入
4
1 0.6 0.4 0.2
输出
38.333
- 由题意可以得出方程d[i] = p[i-1] *(dp[i-1]+1)+(1-p[i-1]) *(dp[i-1]+1+dp[i]-dp[i-2])
- 即dp[i] = 概率命中*(上一步的期望值+1)+概率未命中*(上一步的期望值+1+退回到上上一步到这一步的期望值)
- 化简可以得到dp[i] =(dp[i-1]+1+(p[i-1]-1)*dp[i-2])/p[i-1]
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+9;
double dp[1200],p[1200];
int main()
{
long long i,j,m,n;
scanf("%lld",&n);
for(i = 0;i<n;i++)
{
scanf("%lf",&p[i]);
}
dp[1] = 1;
for(i = 2;i<=n;i++)
{
dp[i] =(dp[i-1]+1+(p[i-1]-1)*dp[i-2])/p[i-1];
}
printf("%.3lf\n",dp[n]);
return 0;
}