题意:
给出n + 1个数和n个位运算操作符,给出每个操作符和其对应的操作数不执行的概率,求出最终结果的期望值
分析:
都是位运算,可以计算出每个二进制位最终为0和1的概率,然后所有二进制位的期望值累加起来就是结果的期望值
代码:
int a[210];
double d[210][22][2], c[210];
char b[210];
int main()
{
int n, kase = 1;
while (~scanf("%d", &n)) {
for (int i = 0; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i++) {
scanf("%s", b + i);
}
for (int i = 1; i <= n; i++) {
scanf("%lf", &c[i]);
}
memset(d, 0, sizeof d);
for (int i = 0; i <= 20; i++) {
d[0][i][a[0] >> i & 1] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= 20; j++) {
int x = a[i] >> j & 1;
for (int k = 0; k < 2; k++) {
d[i][j][k] += d[i - 1][j][k] * c[i];
if (b[i] == '&') {
d[i][j][k & x] += d[i - 1][j][k] * (1 - c[i]);
} else if (b[i] == '|') {
d[i][j][k | x] += d[i - 1][j][k] * (1 - c[i]);
} else {
d[i][j][k ^ x] += d[i - 1][j][k] * (1 - c[i]);
}
}
}
}
double ans = 0;
for (int i = 0; i < 21; i++) {
ans += (1 << i) * d[n][i][1];
}
printf("Case %d:\n%.6f\n", kase++, ans);
}
}