【每日一题】Problem 476B. Dreamoon and WiFi
解决思路
不管 recv 字符串如何,最终的结果一定满足以下条件:
- '+' 数量与 send 字符串相同
- '-' 数量与 send 字符串相同
因此,当 send 中的 '+' 多时,需要 '?' 满足;反之,'?' 需要补充 '-'
到此,将原问题转换成 组合问题
#include <bits/stdc++.h>
int cal(int n, int m) {
if (n < m) {
return -1;
}
int num, den; num = den = 1;
for (int i = 1; i <= n - m; ++i) num *= i;
for (int i = n; i > m; --i) den *= i;
return den / num;
}
int main() {
std::string send, recv;
std::cin >> send >> recv;
int oriPos, oriNeg, curPos, curNeg, miss;
oriPos = oriNeg = curPos = curNeg = miss = 0;
for (int i = 0; i < send.size(); ++i) {
if (send[i] == '+') ++oriPos;
else ++oriNeg;
if (recv[i] == '+') ++curPos;
else if (recv[i] == '?') ++miss;
else ++curNeg;
}
int diff = 0;
if (oriPos >= curPos) diff = oriPos - curPos;
else diff = oriNeg - curNeg;
double ans = 0;
if (miss == 0 && diff == 0) ans = 1;
else if (diff <= miss) ans = cal(miss, diff) / std::pow(2, miss);
std::cout << std::setprecision(12) << ans << std::endl;
return 0;
}
误区
- 需要确保小数点的位数足够
- 只有当前后的 '+' 和 '-' 都一样时,结果才是 100%,其他情况下结果不是 0 就是需要计算组合结果
本文来自博客园,作者:HelloEricy,转载请注明原文链接:https://www.cnblogs.com/HelloEricy/p/17512954.html