A Dangerous Maze(概率與期望(求時間的期望))
阿新 • • 發佈:2019-02-12
【題目來源】: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;
}
}
}