题目描述

刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率

输入

第一行输入一个正整数t,(t<=20),表示有t组测试样例。 第二行输入正整数n,k,(1<=n,k<=1000) 第三行输入n个小数,分别为Pi(1<=i<=n,0<=Pi<=1),表示小X做对第i个题目的概率。

输出

输出小X至少做对k道题的概率,并换行(保留4位小数)
 
--正文
dp
f[i][j] 为在做了i道的时候,做对j道的概率
f[i][j] = f[i-1][j-1] * p[i] +f[i-1][j] * (1- p[i])
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

double pr[1001];
double f[1001][1001];
int main(){
    int time,T; 
    scanf("%d",&T);
    for (time=1;time<=T;time++){
        int n,k;
        scanf("%d %d",&n,&k);
        int i,j;
        for (i=1;i<=n;i++){
            scanf("%lf",&pr[i]); 
        }
        memset(f,0,sizeof(f));
        f[0][0] = 1;
        for (i=1;i<=n;i++){
            f[i][0] = f[i-1][0] * (1 - pr[i]);
            for (j=1;j<=i;j++){
                f[i][j] = f[i-1][j-1]*pr[i] + f[i-1][j] * (1 - pr[i]);
            } 
        }
        double sum = 0;
        for (i=k;i<=n;i++){
            sum += f[n][i];
        }
        printf("%.4lf\n",sum);
    } 
    return 0;
}

 

posted on 2016-12-21 15:00  Crutain  阅读(227)  评论(0编辑  收藏  举报