/*
C++米哈游编程题第3题:计算抽卡得到up角色的期望次数
原来的代码是牛客的一位哈工大计算机大佬的python版本,
这里用chatGPT改为C++版本,输入 0.006, 得到 104.55
以下是chatGPT的回答
*/
#include <iostream>
#include <vector>
using namespace std;
int main() {
double p;
cin >> p; // 从标准输入获取一个浮点数并存储在变量 p 中
vector<double> tmp(181, 0.0); // 创建一个长度为181的 double 类型的向量,并初始化所有元素为0.0
auto wai = [&](double cur, int index) { // 定义一个 lambda 函数 wai,接受两个参数 cur 和 index
for (int i = 1; i < 90; i++) {
tmp[index + i] += cur * p; // 更新 tmp 向量中特定索引位置的元素
cur = cur * (1 - p); // 更新 cur 的值
}
tmp[index + 90] += cur; // 更新 tmp 向量中另一个特定索引位置的元素
};
double cur = 1.0; // 初始化变量 cur 为1.0
for (int i = 1; i < 90; i++) {
tmp[i] += cur * p / 2; // 更新 tmp 向量中特定索引位置的元素
wai(cur * p / 2, i); // 调用 wai 函数,对 tmp 向量的一部分进行更新
cur = cur * (1 - p); // 更新 cur 的值
}
tmp[90] += cur / 2; // 更新 tmp 向量中特定索引位置的元素
wai(cur / 2, 90); // 调用 wai 函数,对 tmp 向量的一部分进行更新
double result = 0.0;
for (int i = 0; i < tmp.size(); i++) {
result += i * tmp[i]; // 计算 tmp 向量中所有元素的加权和,其中权重是元素的索引值
}
cout << result << endl; // 打印结果到标准输出
return 0;
}