题目描述
输入格式
输出格式
输入输出样例 #1
输入 #1
3 2
0.10
0.20
0.30
5 1
0.10
0.10
0.10
0.10
0.10
0 0
输出 #1
Case 1:
0.413043
0.739130
0.847826
Case 2:
0.200000
0.200000
0.200000
0.200000
0.200000
solution
直接统计不包含第 i 个人的剩下人中有 r 个 和 r - 1 个人买东西的概论,然后用贝叶斯概率计算。
代码
#include <iostream>
#include "bit"
#include "vector"
#include "unordered_set"
#include "unordered_map"
#include "set"
#include "queue"
#include "algorithm"
#include "bitset"
#include "cstring"
using namespace std;
const int N = 1001;
int n, r;
// a[i], b[i]: 不包含第i个人的,r个人买东西的概率
double a[21], b[21], p[21];
bool g[21];
void f(int k, int m, float x) {
if (k > n) {
if (m == r - 1) {
for (int i = 1; i <= n; i++) {
if (!g[i]) b[i] += x;
}
}
if (m == r) {
for (int i = 1; i <= n; i++) {
if (!g[i]) a[i] += x;
}
}
return;
}
g[k] = true;
f(k + 1, m + 1, x * p[k]);
g[k] = false;
f(k + 1, m, x * (1 - p[k]));
}
int main() {
for (int j = 1;; j++) {
cin >> n >> r;
if (n == 0) break;
for (int i = 1; i <= n; i++) cin >> p[i];
f(1, 0, 1);
printf("Case %d:\n", j);
for (int i = 1; i <= n; i++) {
//cout << a[i] << " " << b[i] << endl;
printf("%.6f\n", p[i] * b[i] / (p[i] * b[i] + (1 - p[i]) * a[i]));
}
fill(a, a + n + 1, 0);
fill(b, b + n + 1, 0);
}
}