题目:
你在打比赛,这场比赛总共有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; }