首页 > 代码库 > LightOJ 1027 A Dangerous Maze(期望)

LightOJ 1027 A Dangerous Maze(期望)

https://cn.vjudge.net/problem/LightOJ-1027

题意:
有n扇门,每扇门有个时间ti,选择正数的门可以在ti后带你走出迷宫,负数的门会在ti后带你回到起点,然后重新选择,每扇门被选中的概率是一样的,求期望。

 

思路:

做这种期望的问题必须得列一个方程来求解,不然无限写下去的话算不出。

设走出去的期望的E,对于第三个案例就是 E = 1/3 * 3  + 1/3( 6 + E) + 1/3 (9 + E),(选择第一扇门就直接出去,第二扇门先6分钟回去,然后再花期望E,第三扇门同理..)

因为这里每扇门的概率都是一样的,所以对于上式,我们是可以进行合并的,sum1表示正数门时间之和,sum2表示复数门时间之和,cnt1表示正数门数量,cnt2表示负数门数量。

于是,我们可以得到

E=1/n*sum1+1/n*(sum2+cnt2*E) 
化简得: 
E = (sum1 + sum2) / (n-cnt2)。 

 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath>10 #include<map>11 #include<set>12 using namespace std;13 typedef long long ll;14 typedef pair<int,int> pll;15 const int INF = 0x3f3f3f3f;16 const int maxn = 100 + 5;17 18 int n;19 20 int door[maxn];21 22 int gcd(int a,int b)23 {24     return b==0?a:(gcd(b,a%b));25 }26 27 int main()28 {29     //freopen("in.txt","r",stdin);30     int T;31     int kase=0;32     scanf("%d",&T);33     while(T--)34     {35         printf("Case %d: ",++kase);36         scanf("%d",&n);37         for(int i=1;i<=n;i++)  scanf("%d",&door[i]);38 39         int sum1=0,sum2=0;40         int cnt1=0,cnt2=0;41         for(int i=1;i<=n;i++)42         {43             if(door[i]>0)   {cnt1++;sum1+=door[i];}44             else {cnt2++;sum2+=abs(door[i]);}45         }46 47         if(cnt1==0)  {printf("inf\n");continue;}48         int g=gcd(sum1+sum2,n-cnt2);49         printf("%d/%d\n",(sum1+sum2)/g,(n-cnt2)/g);50     }51     return 0;52 }

 

LightOJ 1027 A Dangerous Maze(期望)