LightOJ - 1027 A Dangerous Maze
题意
有n个门,每个门有一个权值 x i x_i xi,如果权值为正,说明如果选择这个门,会在 x i x_i xi分钟后走到终点。如果权值为负,说明如果选择这个门,会在 − x i -x_i −xi分钟之后返回起点,现在问从起点出发,每次随机的选择一个门,求到达终点的期望时间。
做法
首先,这道题要明确一件事情,只要在起点,那么到终点的期望时间就是一样的, 不论经历了什么到达起点。
所以我们可以列出一个方程,设Y为从起点出发到达终点的期望时间,设 P 1 P_1 P1是选择到权值为正的路径的概率, P 2 P_2 P2是选择到权值为负的路径的概率, X 1 X_1 X1 是所有权值为正的路径的平均值, X 2 X_2 X2是所有权值为负的路径的平均值的相反数, N N N是权值为正的路径数量, M M M是权值为负的路径数量,那么有几个显然的等式.
N
=
∑
i
=
1
n
[
x
i
>
0
]
N = \sum_{i=1}^n{[x_i>0]}
N=∑i=1n[xi>0]
M
=
∑
i
=
1
n
[
x
i
<
0
]
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ M = \sum_{i=1}^n{[x_i<0]}
M=∑i=1n[xi<0]
X
1
=
∑
i
=
1
n
x
i
∗
[
x
i
>
0
]
X_1 = \sum_{i=1}^n{x_i*[x_i>0]}
X1=∑i=1nxi∗[xi>0]
X
2
=
∑
i
=
1
n
−
x
i
∗
[
x
i
<
0
]
\ \ \ \ \ \ \ X_2 = \sum_{i=1}^n{-x_i*[x_i<0]}
X2=∑i=1n−xi∗[xi<0]
P
1
=
N
N
+
M
P_1 = \frac{N}{N+M}
P1=N+MN
P
2
=
M
N
+
M
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ P_2 = \frac{M}{N+M}
P2=N+MM
Y
=
P
1
∗
X
1
+
P
2
∗
(
X
2
+
Y
)
Y = P_1*X_1 + P_2*(X_2+Y)
Y=P1∗X1+P2∗(X2+Y)
解方程即可得到 Y = X 1 + X 2 N Y = \frac{X_1+X_2}{N} Y=NX1+X2
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
int cnt=0;
while(t--)
{
int n;
scanf("%d",&n);
ll ans=0;
ll cc=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ans=ans+abs(a[i]);
if(a[i]>0) cc++;
}
if(cc==0) printf("Case %d: inf\n",++cnt);
else printf("Case %d: %lld/%lld\n",++cnt,ans/__gcd(ans,cc),cc/__gcd(ans,cc));
}
return 0;
}