码迷,mamicode.com
首页 > 其他好文 > 详细

HDU5245 Joyful

时间:2015-09-06 22:52:51      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

http://acm.hdu.edu.cn/showproblem.php?pid=5245

题目大意:一个大矩形由n*m个小方块组成,一个人每次选两个小方块,他可以对以这两个方块为顶点的矩形面积内的小方块上色,他一共可选k次,现在求被上色的小方块数目的期望

 

在做这道题的时候能考虑到是期望概率的问题,但是怎么算也得不到样例,看完题解后才明白,欠缺。

 

借鉴的题解:
每个格子可以被重复选,因此可以把每一个小方块选不选当做一个独立事件,所以我们算出每个小方块对总期望的贡献值就行了,直接算不好算,考虑算每个小方块一次不被选的概率p,这个算起来就方便很多,不妨以当前点为中心,那么只有四种情况,被选的两个小方块同在中心的上下左右,不过这样会重复,四个角相当于被算了两次,再把它们减掉一次,这样求出来的是当前点一次不会被上色的情况数,除以总情况数(m * n * m * n)就是当前方块一次不会被上色的概率,再乘k次,就是k次这个方块都不被上色的概率,用1减则为选k次这个方块被上色的概率,只需要把每个方块选k次后被上色的概率累加即可,情况数中间可能会爆int,用__int64

技术分享

此代码在杭电提交C++超时用G++则AC

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
__int64 t,i,j,cas,ii,n,m,k;
double sum,num;
scanf("%I64d",&t);
{
for(ii=1;ii<=t;ii++)
{
scanf("%I64d%I64d%I64d",&m,&n,&k);
sum=num=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
num+=(i-1)*n*(i-1)*n;
num+=(j-1)*m*(j-1)*m;
num+=(m-i)*n*(m-i)*n;
num+=(n-j)*m*(n-j)*m;
num-=(i-1)*(j-1)*(i-1)*(j-1);
num-=(i-1)*(n-j)*(i-1)*(n-j);
num-=(m-i)*(j-1)*(m-i)*(j-1);
num-=(m-i)*(n-j)*(m-i)*(n-j);
num/=n*m*n*m;
sum+=1.0-pow(num,k);
}
}
printf("Case #%I64d: %.0lf\n",ii,sum);
}
}
return 0 ;
}

HDU5245 Joyful

标签:

原文地址:http://www.cnblogs.com/acm31415/p/4787453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!