D题 Talk 题解

/*
令f[i]表示第一次准备讲第i件事时的期望时间
则     f[i] = p[i-1]*(f[i-1]+1) + (1-p[i-1])*(f[i-1]+1 + f[i]-f[i-2])
           讲完i-1后 直接准备讲i   讲完i-1后 回到讲i-2 然后直到准备讲i   
                    
                    f[i-1]+1 为讲完事件i-1时的期望时间     
                    f[i]-f[i-2] 为回到i-2后 然后直到准备讲i 中间需要的时间         
                                                  
化简得    f[i] = (f[i-1]+1+(p[i-1]-1)*f[i-2]) / p[i-1];
初始状态  f[0] = f[1] = 0
目标      f[n+1]
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
double f[N],p[N];
int main(){
    int n;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) scanf("%lf",&p[i]);
    f[0] = f[1] = 0.0;
    for(int i = 2; i <= n+1; i++){
        f[i] = (f[i-1]+1+(p[i-1]-1)*f[i-2]) / p[i-1];
    }
    printf("%.3lf",f[n+1]);
    return 0;
} 

全部评论
点赞 回复 分享
发布于 2020-03-23 15:32
666
点赞 回复 分享
发布于 2020-03-25 12:59
比官方题解详细
点赞 回复 分享
发布于 2020-03-25 12:59

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务