京东笔试---通过考试(DP)

题目描述 

    小明同学要参加一场考试,考试一共有n道题目,小明必须作对至少60%的题目才能通过考试。考试结束后,小明估算出每题作对的概率,p1,p2,...,pn,你能帮他算出他通过考试的概率吗?

输入

    输入第一行一个数n(1<=n<=100),表示题目的个数,第二行n个整数,p1,p2,...,pn,表示小明有pi%的概率作对第i题。(0<=pi<=100)

输出

    小明通过考试的概率,最后结果四舍五入,保留小数点后五位。

样例输入

    4

    50 50 50 50

样例输出

    0.31250

Hint

    第一个样例中,每道题做对的概率都是0.5,想要通过考试至少要作对三题。所以最后的答案就是(C4(3)+C4(4))*0.5^4=5/16;

 

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
double dp[105][105];
double s[105];
double p[105];

int main()
{
    int n;
    scanf("%d",&n);
    int num=n*0.6;
    if(num<n*0.6) num++;
    for(int j=1; j<=n; j++)
        scanf("%lf",&p[j]),p[j]=p[j]/100;
    dp[0][0]=1;
    for(int j=1; j<=n; j++)
    dp[j][0]=dp[j-1][0]*(1-p[j]);

    for(int j=1; j<=n; j++)
    for(int k=1; k<=j; k++)
        dp[j][k]=dp[j-1][k-1]*p[j]+dp[j-1][k]*(1-p[j]);
    s[0]=dp[n][0];
    for(int k=1; k<=n; k++)
    s[k]=s[k-1]+dp[n][k];

    printf("%.5lf\n",1-s[num-1]);
    return 0;
}

 

posted @ 2017-04-23 19:06  茶飘香~  阅读(690)  评论(0编辑  收藏  举报