题目描述

你在打比赛,这场比赛总共有12个题

对于第i个题,你的队伍有a[i]的几率解决她

如果解决不了她呢?

由于所有人讨论的都很大声

所以你有b[i]的概率从左边那个队那里听会这个题的做法

有c[i]的概率从右边那个队那里听会这个题的做法

请问最终你们队伍解出0-12题的概率分别是多少

输入描述:

第一行12个数表示a[1] -> a[12]
第二行12个数表示b[1] -> b[12]
第三行12个数表示c[1] -> c[12]

输出描述:

输出13行,第i行表示解出i-1题的概率
保留6位小数

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define db double
const int N=205,mod=999983;
int n=12;db a[N],b[N],c[N],d[N];
inline db dfs(int now,int num){
    db ans=1;
    if(now==13&&num)return 0;
    if(now==13)return ans;
    if(num==0){
        for(int i=now;i<=12;i++)ans*=1-d[i];
        return ans;
    }
    return ans*(dfs(now+1,num-1)*d[now]+dfs(now+1,num)*(1-d[now]));
}
signed main(){
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    for(int i=1;i<=n;i++)cin>>c[i];
    db ans=1;
    for(int i=1;i<=n;i++)
    d[i]=1-((1-a[i])*(1-b[i])*(1-c[i])),ans*=(1-d[i]);
    printf("%.6f\n",ans);
    for(int i=1;i<=n;i++){
        printf("%.6f\n",dfs(1,i));
    }
}
01-11 01:21