题目:

你在打比赛,这场比赛总共有12个题。对于第i个题,你的队伍有a[i]的几率解决它。有b[i]的概率从左边那个队那里听会这个题的做法,有c[i]的概率从右边那个队那里听会这个题的做法。
请问最终你们队伍解出0-12题的概率分别是多少?


做法:

每道题做出来的概率可以直接算出来。
然后只有12道题。那就二进制枚举暴力做题的所有状态,算概率,累加即可。


代码:

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false), cin.tie(0)
#define debug(a) cout << #a ": " << a << endl
using namespace std;
typedef long long ll;
double a[15], b[15], c[15], done[15], ans[15];
int main(void){ 
    IOS;
    for (int i = 0; i < 12; ++i) cin >> a[i];
    for (int i = 0; i < 12; ++i) cin >> b[i];  
    for (int i = 0; i < 12; ++i) cin >> c[i];
    for (int i = 0; i < 12; ++i){
        done[i] = a[i]+(1.0-a[i])*b[i]+(1.0-a[i])*(1.0-b[i])*c[i];
    }
    for (int i = 0; i < (1<<12); ++i){
        int cnt = 0;
        double t = 1.0;
        for (int j = 0; j < 12; ++j){
            if ((i>>j)&1){
                t *= done[j]; cnt++;
            }else{
                t *= (1.0-done[j]);
            }
        }
        ans[cnt] += t;
    }
    for (int i = 0; i < 13; ++i){
        cout << setprecision(6) << fixed << ans[i] << endl;
    }
    return 0;
}