A Dangerous Maze(概率与期望(求时间的期望))

来源:互联网 发布:网络买鞋子怎么买 编辑:程序博客网 时间:2024/06/05 11:28

【题目来源】: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;        }    }}
原创粉丝点击