HDU - 5245 概率

JoyfulHDU - 5245

  题目大意:有N*M个正方形,进行k次涂色,每次会随机的选两个正方形作为一个矩形区域的顶点,然后把这个区域内的涂色,最后问k次之后,预计被涂了色的正方形有几个(也就是数学期望),转化成整数输出。

  数学期望的定义是一切可能的取值xi与对应的概率Pi(=xi)之积的和,所以就想到了求出每个正方形被涂色的概率,然后一个正方形的权值就是1,所以把每个正方形的被涂色的概率加起来就是答案。因为是进行k次涂色,那么k中至少有一次被涂到的概率就是1-k次都涂不到的概率。

  至于怎么算它不被涂到的概率呢?首先因为作为顶点的两个正方形是选择是互不影响的,每个都有n*m种选择,所以总的方案就是n*m*n*m。然后不把当前正方形包含在矩形内的方案有多少,可以画图理解。

  

  红色正方形就是我们目前要求的正方形,因为不能把它包含在内,那么两个正方形的选择应该在同一侧,就像上图的蓝色部分,然后在同一侧的两个正方形的选择是互不影响的,也就是所有正方形个数的平方。而蓝色部分重叠了绿色部分,所以绿色部分得去掉。

 1 #include<cstdio>
 2 #define pf(x) (x*x)
 3 typedef long long ll;
 4 int main()
 5 {
 6     int t=1,T,n,m,k;
 7     scanf("%d",&T);
 8     while(t<=T)
 9     {
10         scanf("%d%d%d",&n,&m,&k);
11         ll sum=1ll*pf(n)*pf(m);
12         double ans=0.0;
13         for(int i=1;i<=n;i++)
14             for(int j=1;j<=m;j++)
15             {
16                 ll num=0;
17                 num+=pf(1ll*n*(j-1))+pf(1ll*n*(m-j));//左右两侧的方案 
18                 num+=pf(1ll*m*(i-1))+pf(1ll*m*(n-i));//上下两侧的方案 
19                 num-=pf(1ll*(i-1)*(j-1))+pf(1ll*(i-1)*(m-j));//上侧两角的方案 
20                 num-=pf(1ll*(n-i)*(j-1))+pf(1ll*(n-i)*(m-j));//下侧两角的方案 
21                 double no=1.0*num/sum,kno=1.0;
22                 for(int kk=0;kk<k;kk++)
23                     kno*=no;
24                 ans+=1.0-kno;
25             }
26         printf("Case #%d: %.0f\n",t++,ans);
27     }
28     return 0;
29 } 
我不是一个粉刷匠

猜你喜欢

转载自www.cnblogs.com/LMCC1108/p/10761624.html
今日推荐