您的位置:首页 > 其它

HDU 5245 Joyful 【期望概率】

2018-03-19 18:58 441 查看
传送门

// 题意: 一个n*m的地图, 等可能的选择其中两块, 围成的矩形涂上颜色, 问最后有多少块被涂上了颜色, 也就是问期望. 四舍五入.

(先吐槽一波: 我的概率是真的菜… 这道题比赛的时候就是没做出来……..)

思路: 既然是期望题, 我们首先要联系概率, 那么对于一个点它一次被涂上的概率是p , 那么不被涂的概率就是1-p, 那么k次没有被涂的概率就是(1-p)^k, (因为这个是独立事件, 所以可以直接k次方, 而p却不具有这个性质, 所以算反面…..) 那么k次被涂上的概率就是1 - (1-p)^k. 所以我们直接累加每一个块的概率就是ans.

那么对于同一个块的概率怎么算了? 盗用一张图:


用的这个博客的

所以我们先算总的基本事件: 每个块被选的可能是n*m, 那么两个块就是n*m*n*m.

然后分类讨论:

1: 在第一块的选1区域的时候, 第二块可以在5, 6, 8, 9

2: 在第一块的选3区域的时候, 第二块可以在4, 5, 7, 8

3: 在第一块的选7区域的时候, 第二块可以在2, 3, 5, 6

4: 在第一块的选9区域的时候, 第二块可以在1, 2, 4, 5

5: 在第一块的选2区域的时候, 第二块可以在4, 5, 6, 7, 8, 9

6: 在第一块的选4区域的时候, 第二块可以在2, 3, 5, 6, 8, 9

7: 在第一块的选6区域的时候, 第二块可以在1, 2, 4, 5, 7, 8

8: 在第一块的选8区域的时候, 第二块可以在1, 2, 3, 4, 5, 6

9: 在第一块的选5区域的时候, 第二块可以在任意区域.

所以按照面积占比的概率算即可. 复杂度O(n*m*T)

AC Code

using namespace std;
const int maxn = 1e5+5;
void solve()
{
db n, m; int k;
cin >> n >> m >> k;
db ans = 0.0;
for (int i = 1 ; i <= n ; i ++) {
for (int j = 1 ; j <= m ; j ++) {
db p = 0.0;
p += (i-1)*(j-1) * (n-i+1)*(m-j+1); // 1 和右下
p += (i-1)*(m-j) * (n-i+1)*j; // 3 和左下
p += (n-i)*(j-1) * i*(m-j+1); // 7 和右上
p += (n-i)*(m-j) * i*j; // 9 和左上
p += (i-1) * (n-i+1)*m; // 2 和下面
p += (j-1) * n*(m-j+1); // 4 和右面
p += (m-j) * n*j; // 6 和左面
p += (n-i) * i*m; // 8 和上面
p += n*m; // 5 和全体
p = p/n/n/m/m;
ans += 1 - pow(1-p, k);
}
}
cout << int(ans+0.5) << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: