【非原创】LightOJ - 1284 Lights inside 3D Grid【概率期望】
学习博客:
题意:
在一个三维的空间,每个点都有一盏灯,开始全是关的,
现在每次随机选两个点,把两个点之间的全部点,开关都按一遍;问k次过后开着的灯的期望数量;
题解:
肯定不能从随机抽取两个数这里入手的,要求开着的灯的数量就从对每一盏灯,操作结束后灯开着的概率,然后将这些概率求和就是对于整个矩阵到最后开着的灯的数量了,这就把矩阵的问题落实到了对于求每个坐标的概率的问题。
对每个点单独计算贡献,即k次过后每个点开关被按了奇数次的期望
一个点如果被包到所选空间里,那么说明选的两个点,x坐标在这个点两侧,y坐标在这个点两侧,z坐标在这个点两侧;
对于一维的,可以用求出两个点在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 }