我要闯关,每一关耗费一时间,有 pi 的概率获胜,获胜则进入下一关,失败则回到第一关,求通过第n关的期望时间。
那就是说对于第i关有 pi 的概率耗费1时间通过,有 1−pi 的概率要用 ∑j=1i−1fj+1 的时间通过。∴fi=pi+(1−pi)(∑j=1i−1fj+1) ,然后用一个变量记录前面 fj 的和(类似前缀和),复杂度 O(n) ,最后结果就是 ∑i=1nfi
全WA qaq
窝不是伸手党qaq
#include<cstdio>
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
int t,n,i,j; double s,q,p[N],f[N];
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%lf",&p[i]);//输入
for(i=1;i<=n;i++)
{
q+=f[i-1];//前面的和
f[i]=p[i]+(1-p[i])*(1+q);//递推
//printf("%lf\n",f[i]);
}
for(i=1;i<=n;i++) s+=f[i];//结果
printf("%lf",s);//输出
return 0;
}