題目描述
衆所周知,牛可樂 的口胡能力十分強大.牛可樂 要講 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;
}