【题目背景】
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; }