POJ 2151 Check the difficulty of problems

/*
    我們很容易得到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);
    }
}
發佈了95 篇原創文章 · 獲贊 183 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章