1. 程式人生 > >A Dangerous Maze(概率與期望(求時間的期望))

A Dangerous Maze(概率與期望(求時間的期望))

【題目來源】https://cn.vjudge.net/problem/LightOJ-1027
【題意】
處在一個迷宮裡,面前有n扇門,每一扇都可能帶離你走出迷宮,若能帶離,那麼會花費一個時間值,表示為正值, 若不能帶離,那就是返回到初始的位置,也會花費一個時間,表示為負值,問,若是能夠走出迷宮,需要花費時間的期望值。
【思路】
這是我做的第一道概率與期望題,起初感覺並不是多好理解,但是也要堅持。翻了二十多篇部落格,先把兩篇比較好的進行分享:
http://blog.csdn.net/chenzhenyu123456/article/details/47720573
http://blog.csdn.net/catglory/article/details/50757654


假設能走出去的時間期望值為E。
每一步有兩種選擇:
1.當前部可以出去:
期望為:1/n*t
2.當前部不可以出去,回到原點,然後再加上出去的期望:
期望為:1/n*t+1/n*E
設所有可以將你傳送出去的門的時間值 總和為sum1,所有可以將你傳送回去的門的時間值 總和為sum2。
設所有可以將你傳送出去的門的數目為door1,所有可以將你傳送回去的門的數目為door2。
得:
E=1/n*sum1+1/n*(sum2+door2*E)
化簡得:
E = (sum1 + sum2) / (n-door2)。
當然,n-door2==0無解,輸出inf。
【程式碼】

#include<iostream>
using namespace std; int gcd(int a,int b) { if(b==0) return a; else return a=gcd(b,a%b); } int main() { int T,t=1; cin>>T; while(T--) { int n; cin>>n; int sum1=0; int sum2=0; int x; int door=0; for
(int i=0;i<n;i++) { cin>>x; if(x<0) { sum2+=(-x); door++; } else sum1+=x; } if(n-door==0) { cout<<"Case "<<t++<<": inf"<<endl; } else { int a=n-door; int b=sum1+sum2; // cout<<a<<" "<<b<<endl; int res=gcd(a,b); cout<<"Case "<<t++<<": "<<b/res<<"/"<<a/res<<endl; } } }