题目链接:[点这儿].
题意:
你在一个迷宫里,迷宫里有
n
扇门,每扇门有且只有下面两种功能之一:
- 花费
x
分钟逃出迷宫;- 花费
x
分钟回到原来的位置.你选着任意一扇门的概率相等,问你逃出迷宫的时间的期望.
解析:
这个题的关键是把能逃出迷宫的门合并起来,把回到原位置的门合并起来,这样每次选择就变成了一个0-1分布,然后列式子化简。
设逃出迷宫的门(已经合并了)的逃出时间的期望是 EA=sumaa ,回到原位置的门的花费时间的期望是 EB=sumbb ;由题可知下列关系: sum=suma+sumb,n=a+b 。
选择逃出迷宫的门的概率 pa=an ,选择回到原位置的门的概率 pb=bn ;
设第 k 次逃出迷宫,那么在前
k−1 次就必须选择回到原位置的门,故第 k 次逃出迷宫的概率为Pk=pa∗pk−1a ,第 k 次逃出迷宫的时间为Tk=EA+(k−1)∗EB ,因此总时间为T=∑k=1∞Pk∗Tk=pa∗[EA∗∑k=1∞pk−1b+EB∗pb∑k=1∞(k−1)∗pk−2b]
应用无穷级数的和函数或者等比公式求和可以算出来最终结果为T=suma
没错,就是这么简单,学好概率论和高等数学还是有用的.
代码:
#include <bits/stdc++.h>
using namespace std;
int gcd(int x, int y)
{
return y ? gcd(y, x % y) : x;
}
int main()
{
int T, K = 1;
for (cin >> T; T--; K++) {
int n, x, a = 0, sum = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
if (x > 0)
++a;
sum += abs(x);
}
cout << "Case " << K << ": ";
if (!a)
cout << "inf";
else {
int g = gcd(sum, a);
cout << sum / g << "/" << a / g;
}
cout << endl;
}
return 0;
}