题解
2026-02-01 18:01:45
发布于:湖南
1阅读
0回复
0点赞
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
// 计算组合数 C(n, k)
long long comb(int n, int k) {
if (k < 0 || k > n) return 0;
if (k == 0 || k == n) return 1;
k = min(k, n - k); // 利用对称性减少计算量
long long res = 1;
for (int i = 1; i <= k; ++i) {
res = res * (n - k + i) / i;
}
return res;
}
int main() {
string original, received;
cin >> original >> received;
// 计算原始指令的目标位置
int target = 0;
for (char c : original) {
target += (c == '+') ? 1 : -1;
}
// 计算收到指令的确定位置和问号数量
int pos = 0;
int q_cnt = 0;
for (char c : received) {
if (c == '+') pos++;
else if (c == '-') pos--;
else q_cnt++;
}
// 计算需要的净位移
int delta = target - pos;
// 计算概率
double prob = 0.0;
if (abs(delta) <= q_cnt && (q_cnt + delta) % 2 == 0) {
int m = (q_cnt + delta) / 2;
long long c = comb(q_cnt, m);
prob = static_cast<double>(c) / (1LL << q_cnt);
}
// 输出结果,保留6位小数
cout << fixed << setprecision(6) << prob << endl;
return 0;
}
这里空空如也







有帮助,赞一个