数值操作的期望计算问题

101 阅读2分钟

#include #include #include // 用于格式化输出 using namespace std; string solution(int a, int b) { // 计算期望值 // 1. 计算所有可能的操作结果 // 2. 计算每种结果的概率 // 3. 使用加权平均的方法计算期望值

// 计算每种组合的概率和结果
double expected_value = (1.0/4) * (4*a + b) + (1.0/2) * (2*a + 2*b) + (1.0/4) * (a + 4*b);

// 格式化输出为两位小数的字符串
ostringstream oss;
oss << fixed << setprecision(2) << expected_value;
return oss.str();

} int main() { // 打印实际输出以便调试 cout << solution(3, 3) << endl; cout << solution(5, 7) << endl; cout << solution(1, 1) << endl; // 测试样例 cout << (solution(3, 3) == "13.50") << endl; cout << (solution(5, 7) == "27.00") << endl; cout << (solution(1, 1) == "4.50") << endl; return 0; } 算法思路 该算法计算的是在一个特定的操作下,两个整数 a 和 b 的期望值。操作规则如下(假设 a 和 b 是两个初始值): 四种可能的操作: 加 a 到 b,结果是 a + b。 加 b 到 a,结果是 a + b。 加 a 的两倍到 b,结果是 2a + b。 加 b 的两倍到 a,结果是 a + 2b。 每种操作的概率: 加 a 到 b 或加 b 到 a 的概率是 1/4(因为有两种方式得到 a + b,且总概率为 1,故每种占 1/4)。 加 a 的两倍到 b 或加 b 的两倍到 a 的概率是 1/2(因为有两种方式得到 2a + b 或 a + 2b,且这两种情况的总概率应为 1 - 1/4 - 1/4 = 1/2,每种占 1/2)。 计算期望值: 使用加权平均法计算期望值。期望值是每种可能结果的概率乘以该结果的总和。 算法解析 计算期望值: E = (1/4) * (a + b) + (1/4) * (a + b) + (1/2) * (2a + b) + (1/2) * (a + 2b) 由于 (a + b) 出现了两次且概率为 1/4,可以合并为 (1/2) * (a + b)。 因此,期望值可以简化为: E = (1/2) * (a + b) + (1/2) * (2a + b) + (1/2) * (a + 2b) 进一步合并同类项: E = (1/4) * (4a + 2b) + (1/2) * (2a + 2b) + (1/4) * (2a + 8b) E = (1/4) * (4a + b + b + b + 4a + 4b + a + 8b - 3b - 3b) (这里为了展示每项来源,故意拆分和重组,实际计算中无需此步) E = (1/4) * (4a + b) + (1/2) * (2a + 2b) + (1/4) * (a + 4b) (简化回原表达式) 格式化输出: 使用 ostringstream 和 iomanip 库来格式化输出结果,确保输出为两位小数。 主函数: 调用 solution 函数计算期望值,并打印结果。 使用断言(这里使用简单的 == 比较字符串)来验证计算是否正确。