LightOJ - 1027 A Dangerous Maze
题意
有n个门,每个门有一个权值xix_ixi?,如果权值为正,说明如果选择这个门,会在xix_ixi?分钟后走到终点。如果权值为负,说明如果选择这个门,会在?xi-x_i?xi?分钟之后返回起点,现在问从起点出发,每次随机的选择一个门,求到达终点的期望时间。
做法
首先,这道题要明确一件事情,只要在起点,那么到终点的期望时间就是一样的, 不论经历了什么到达起点。
所以我们可以列出一个方程,设Y为从起点出发到达终点的期望时间,设P1P_1P1?是选择到权值为正的路径的概率,P2P_2P2?是选择到权值为负的路径的概率,X1X_1X1? 是所有权值为正的路径的平均值,X2X_2X2?是所有权值为负的路径的平均值的相反数,NNN是权值为正的路径数量,MMM是权值为负的路径数量,那么有几个显然的等式.
N=∑i=1n[xi>0]N = \sum_{i=1}^n{[x_i>0]}N=∑i=1n?[xi?>0] M=∑i=1n[xi<0]\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ M = \sum_{i=1}^n{[x_i<0]} M=∑i=1n?[xi?<0]
X1=∑i=1nxi?[xi>0]X_1 = \sum_{i=1}^n{x_i*[x_i>0]}X1?=∑i=1n?xi??[xi?>0] X2=∑i=1n?xi?[xi<0]\ \ \ \ \ \ \ X_2 = \sum_{i=1}^n{-x_i*[x_i<0]} X2?=∑i=1n??xi??[xi?<0]
P1=NN+MP_1 = \frac{N}{N+M}P1?=N+MN? P2=MN+M\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ P_2 = \frac{M}{N+M} P2?=N+MM?
Y=P1?X1+P2?(X2+Y)Y = P_1*X_1 + P_2*(X_2+Y)Y=P1??X1?+P2??(X2?+Y)
解方程即可得到Y=X1+X2NY = \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;
}