题目:
你在打比赛,这场比赛总共有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;
}
京公网安备 11010502036488号