【非原创】LightOJ - 1284 Lights inside 3D Grid【概率期望】

学习博客:

戳这里

戳这里   

戳这里

戳这里

 

题意:
在一个三维的空间,每个点都有一盏灯,开始全是关的,
现在每次随机选两个点,把两个点之间的全部点,开关都按一遍;问k次过后开着的灯的期望数量;

 

题解:

肯定不能从随机抽取两个数这里入手的,要求开着的灯的数量就从对每一盏灯,操作结束后灯开着的概率,然后将这些概率求和就是对于整个矩阵到最后开着的灯的数量了,这就把矩阵的问题落实到了对于求每个坐标的概率的问题。

对每个点单独计算贡献,即k次过后每个点开关被按了奇数次的期望

一个点如果被包到所选空间里,那么说明选的两个点,x坐标在这个点两侧,y坐标在这个点两侧,z坐标在这个点两侧;

对于一维的,可以用1-\frac{(x-1)*(x-1)+(n-x)*(n-x)}{n*n}求出两个点在x这一点两侧的概率。然后三维的只要当成三个一维的乘起来就行了。

E=

求法:


这里写图片描述

 

 代码(亦非原创):

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int t,x,y,z,m;
 6 
 7 int main()
 8 
 9 {
10 
11     scanf("%d",&t);
12 
13     int cas=0;
14 
15     while(t--)
16 
17     {
18 
19         scanf("%d%d%d%d",&x,&y,&z,&m);
20 
21         double ans=0.0;
22 
23         for(int i=1;i<=x;i++)
24 
25         for(int j=1;j<=y;j++)
26 
27         for(int k=1;k<=z;k++)
28 
29         {
30 
31             double p=0.0;
32 
33             p= 1.0-1.0*((x-i)*(x-i)+(i-1)*(i-1))/(x*x);
34 
35             p*=1.0-1.0*((y-j)*(y-j)+(j-1)*(j-1))/(y*y);
36 
37             p*=1.0-1.0*((z-k)*(z-k)+(k-1)*(k-1))/(z*z);
38 
39  
40 
41             ans+=0.5-0.5*pow(1.0-2*p,1.0*m);
42 
43         }
44 
45         printf("Case %d: %.11lf\n",++cas,ans);
46 
47     }
48 
49     return 0;
50 
51 }
View Code

 

posted @ 2018-10-09 15:59  euzmin  阅读(294)  评论(0编辑  收藏  举报