1. 程式人生 > >【期望dp】Lightoj 1027 A Dangerous Maze

【期望dp】Lightoj 1027 A Dangerous Maze

一道很好的概率期望題目,沒用到dp不過,再次理解了統計平均(期望E)

/*
light_oj 1027  期望DP

並沒有什麼遞推
題意:
      n個傳送門,m個可以逃離,其他的
求解:
      E表示成功逃離的時間期望,E1表示逃離時間的統計平均,E2表示返回原地的統計平均
      p表示成功逃離的概率,p = m/n
      事件可分解為一次性成功逃離,返回原地後再逃離,利用全期望公式有
      E = p*E1 + (1-p)*(E2 + E)
      (返回原地消耗E2的時間,再逃離還是要花費E)
      E1 = s1/m, E2 = s2/(n-m);s1是正的時間和,s2是負的時間和取絕對值
      整理得到E = (s1 + s2 )/m,gcd求最大公約數表示下就可以了
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define long long ll
#define M 10
#define N 1010
using namespace std;
const int _max = 1e5 + 10;

int x,n,m,s1,s2,s;

int gcd(int a,int b){return b?gcd(b,a%b):a;}

int main()
{
   #ifndef ONLINE_JUDGE
   freopen("input.txt","r",stdin);
   #endif // ONLINE_JUDGE
   int T;cin>>T;int cnt =1;
   while(T--){
    scanf("%d",&n);
    s1 = s2 = m = 0;
    for(int i = 0; i < n; ++ i){
        scanf("%d",&x);
        if(x>0) s1+=x,m++;
        else s2+=abs(x);
    }
    printf("Case %d: ",cnt++);
    if(!s1) {puts("inf");continue;}
    s = s1 + s2;
    int d = gcd(s,m);
    printf("%d/%d\n",s/d,m/d);
   }
   return 0;
}