您的位置:首页 > 其它

POJ 2151 Check the difficulty of problems

2017-05-12 21:39 363 查看
/*
我们很容易得到e[i][j]表示做了前i题A了j题的概率
于是我们可以用s[i][j]记录e[m][(0~j)]的前缀和即表示第i队的 A(0~j)题的概率
*/
#include<stdio.h>
#include<string.h>
using namespace std;
const int M=55;
double e[M][M],p[1005][M],s[1005][M];
int main(){
int n,m,k;
while(~scanf("%d %d %d",&m,&n,&k)&&m){
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
scanf("%lf",&p[i][j]);
for(int i=1;i<=n;i++){
e[0][0]=1;
for(int j=1;j<=m;j++)e[j][0]=e[j-1][0]*(1-p[i][j]);
for(int j=1;j<=m;j++)for(int a=1;a<=j;a++)
e[j][a]=e[j-1][a]*(1-p[i][j])+e[j-1][a-1]*p[i][j];

s[i][0]=e[m][0];
for(int j=1;j<=m;j++)
s[i][j]=s[i][j-1]+e[m][j];
//表示第i队做出的题小于等于j的概率
}
double P1=1,P2=1;//分别表示每队全A的概率和每队只A 1~k-1题的概率
for(int i=1;i<=n;i++)P1*=(1-s[i][0]),P2*=(s[i][k-1]-s[i][0]);
printf("%.3f\n",P1-P2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: