保送

【题目背景】

yk同学赫赫有名,为什么呢?因为他参加了若干竞赛,所以认识无数大朋友和小盆友。可是无数大朋友和小盆友也都认识他,为什么呢?因为yk同学实在是太牛了~ 我们甚至经常可以在路上听到同学之间的典型谈话:

小A:你认识yk吗?

小B:当然认识啦,就是那个XX竞赛班的大牛哇~

小A:他不光是XX竞赛班的神牛,还是XXX竞赛班的神牛呢~

小B:哦~~

然后小A小B一起无限膜拜中……

那么,yk同学到底神到什么地步呢?

世界上总共有N门竞赛,yk同学参加了全部,并且都能拿到保送!!运气好的时候呢,还能拿到一等奖!!怎么样,厉害吧~~

【题目描述】

现在有N门竞赛,yk同学对于不同学科有不同的概率拿到一等奖。现在yk想知道,他有多少的概率至少拿到M个一等奖。

【输入格式】promotion.in

第一行两个用空格隔开的正整数N,M

下面N行,每行一个0~1的实数,第i+1行的实数表示第i门科目得到一等奖的概率。

【输出格式】promotion.out

一行一个实数,表示至少得到M门一等奖的概率。实数保留六位小数。

【输入样例1】promotion.in

2 1

1

1

【输出样例1】

1.000000

【输入样例2】

3 1

0.046921

0.959868

0.008229

【输出样例2】

    0.962066

【数据范围】

50% M<=N<=20

100% M<=N<=100


让人摸不着头脑的概率DP

思路:

 欲做此题,必会概率

学长的题解>:<

设f[i][j]表示前i科竞赛共获得j门一等奖的概率

f[0][0]=1; // 肯定的

f[i][0]=f[i -1][0]*(1-gl[i]);

// 前 i 科竞赛拿0个奖的概率 = ( 前 i -1 科竞赛拿0个奖的概率 ) x ( 第 i 科竞赛不拿奖的概率 )

f[i][j]=f[i-1][j]*(1-gl[i])+f[i -1][j -1]*gl[i];

// 前 i 科竞赛拿 j 个奖的概率 = ( 前 i -1 个竞赛拿 j 个奖的概率)x( 第 i 个竞赛不拿奖的概率 )+( 前 i -1 个竞赛拿 j -1 个奖的概率 ) x ( 第 i 个竞赛拿奖的概率 )

代码^-^

#include<stdio.h>
#include<algorithm>
using namespace std;
double pro[101],f[101][101];
int n,m;

int main()
{
//    freopen("promotion.in","r",stdin);
//    freopen("promotion.out","w",stdout);
    scanf("%d%d",&n,&m);
    f[0][0]=1;
    for(int i=1;i<=n;++i)
    {
        scanf("%lf",&pro[i]);
        f[i][0]=f[i-1][0]*(1-pro[i]);//前 i 科拿 0 个奖 
    }
    for(int i=1;i<=n;++i) 
        for(int j=1;j<=i;++j) 
             f[i][j]=f[i-1][j]*(1-pro[i]) + f[i-1][j-1]*pro[i];
    
    double ans=0;         
    for(int i=m;i<=n;++i) ans+=f[n][i];
    printf("%.6lf",ans);
    return 0;
}
从0到1很难,但从1到100很容易
原文地址:https://www.cnblogs.com/qseer/p/9501850.html