题意:
给一个
n∗m∗P
的长方体,一共有
n∗m∗P
个灯均匀分布在长方体中,每次随机选择两个灯,把在他们中间的所有灯改变状态(On 或者 Off),一开始所有灯的状态都为 Off,问k步之后期望多少灯亮。
题解:
首先,期望是线性的,可以把所有灯亮的概率相加。考虑如何计算每个灯的概率:
先算出每个灯的各个坐标被选取的概率,然后相乘(这个很好求)。设其为
p
,那么显然有:
利用数列可推得
On[i]={1On[i−1]∗(1−2∗p)+p(p==1)(Otherwise)
接下来就是数学的事了。。
#include<bits/stdc++.h>
using namespace std;
const int Maxn=1e3+50;
int T,n[3],k,tt;
double ans,fx[3][Maxn];
inline double calc(double p){
if(k==1)return p;
else if(p==1)return 1;
return pow(1.0-2.0*p,k-1)*(p-0.5)+0.5;
}
int main(){
scanf("%d",&T);
while(++tt,T--){
for(int i=0;i<3;i++)scanf("%d",&n[i]);
scanf("%d",&k);ans=0;
for(int i=0;i<3;i++)
for(int j=1;j<=n[i];j++)
fx[i][j]=(double)(j-1)*(n[i]-j)/n[i]/n[i]*2.0+(double)(2*n[i]-1)/n[i]/n[i];
for(int i=1;i<=n[0];i++){
for(int j=1;j<=n[1];j++){
for(int l=1;l<=n[2];l++){
ans+=calc(fx[0][i]*fx[1][j]*fx[2][l]);
}
}
}
printf("Case %d: %.8f\n",tt,ans);
}
}
探讨了一个涉及概率计算的问题,即在一个n*m*P的长方体中,初始状态下所有灯处于关闭状态,通过随机选择两个灯并改变它们之间的灯的状态,求解在k次操作后预期有多少灯会处于开启状态。
93

被折叠的 条评论
为什么被折叠?



