[10.08模拟赛] 龙妹妹喝牛奶 (期望)

[模拟赛] 龙妹妹喝牛奶 (期望)

题目描述

As we know ,龙妹妹非常喜欢喝牛奶。
As we know ,龙妹妹需要减肥。
As we all know, 龙妹妹是代码狂魔。
当龙妹妹对着一堆牛奶想着减肥的时候,他想起了ufo对他的教诲:”犹豫不决吗?那就写一个rand()吧。”¥……&**…#@!
于是,龙妹妹把他的牛奶排成了一个N*M的矩阵,每当他要喝牛奶时,他就运行以下代码。((random(x))为等概率生成任意[1,x]中的任意一个正整数)
(x1=random(N);)
(y1=random(M);)
(x2=random(N);)
(y2=random(M);)
然后将以(x1,y1),(x2,y2)为两个顶点的,四条边平行于边界的一个子矩形内的牛奶全部喝掉,再把空盒放回原处(显然,如果某个格子上的牛奶已经被喝掉了,那她就只能拿到一个空盒)
在这题中,我们假定random()函数非常完美,得到每个格子的概率相等。
请你帮龙妹妹算一算,K次之内她期望可以喝到多少牛奶?

输入

一行内包含3个正整数K,N,M。

输出

一个整数,K次之内她期望可以喝到牛奶的盒数(四舍五入精确到整数)。

样例输入

1 3 3

样例输出

4

提示

【数据范围】
0<=K<=10000 1<=N<=1000 1<=M<=1000
测试点 特点
(0、1 0<=K<=10 N=1)(M=1)
(2、3 K=1)
(4、5 0<=K<=2,N<=5,M<=5)
(6、7 0<=K<=10)
(8、9)
【样例解释】
对于样例输入,简单的解释是这样的:在(3 imes 3)的格子里取子矩形,取到(1 imes 1)的方案数为9,取到(1 imes 2)(2 imes 1)的方案数为24,取到(1 imes 3)(3 imes 1)的方案数 为12,取到(2 imes 2)的方案数为16,取到(2 imes 3)(3 imes 2)的方案数为16,取到(3 imes 3)的方案数为4结果约为 ((1 imes 9+2 imes 24+3 imes 12+4 imes 16+6 imes 16+9 imes 4)/(9 imes 9)=3.5679),四舍五入后得4。

Solution

60分:按照题目描述随机,(反正我是没有60)
100分:
记住一句话

期望的和=和的期望

题目要求我们计算所有格子牛奶的期望,我们可以转化思路,对于每个格子分别处理,最后求和

思考这样一个问题:一个人有一把枪,每次击中目标的几率为(50\%),问至少多少次开枪后目标被击中的概率至少为(90\%)?

我们假设k次后概率至少为(90\%),其实在这期间只要打中一枪,概率就会为(90\%)以上,也可能打中多次,并不好统计答案,怎么办?

问题可以转化为求多少次之后目标没有被打中的概率降到(10\%)及以下

这要求我们前k次都不能打中,这只有一种情况,比之前好算的多
((frac{1}{2})^k<=frac{1}{10}),解得k=4

这启发我们当直接计算状态过多时,我们可以考虑间接求出答案

本题就是如此...

首先,总矩形数为(n^2 imes m^2)(因为x1,y1,x2,y2并没有大小要求,横坐标的取值范围都是[1,n],纵坐标都是[1,m])

对于一个点,我们求出它在k次之后依然没有被选的概率,即1.0-选的概率

由于行,列互不影响,我们可以单独考虑最后相乘

单独考虑行的情况,假设我们在一行的第x列,我们有两种情况覆盖这个点即选中[1,x]和选中[x,n]所以我们的方案数就是(x imes (n-x+1))
列的情况同理处理,然后相乘

又因为坐标是可以交换确定矩形的,所以还要乘一个2,我们发现这会多算一遍x=n-x+1的情况,所以还要-1

最后方案数就是((2 imes x imes (n-x+1)-1) imes (2 imes y imes (m-y+1)-1))

除以矩形的个数就是期望了,这个矩形个数并不是真正的矩形个数
假设我们通过左上角(x1,y1)和右下角(x2,y2)来确定矩形,这要求(x1<=x2,y1<=y2),而题目描述所选的坐标并不满足这个要求,每个取值都是[1,n]或者[1,m],所以就是上述讲的(n^2 imes m^2)

Code

#include<bits/stdc++.h>
#define rg register
#define il inline
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
#define lol long long
#define in(i) (i=read())
using namespace std;
const int N=1010;
lol read() {
	lol ans=0,f=1; char i=getchar();
	while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
	while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
	return ans*=f;
}

lol n,m,k;
double AQ,base,ans;
int main()
{
    //freopen("milk.in","r",stdin);
    //freopen("milk.out","w",stdout);
    in(k),in(n),in(m); base=1.0/n/n/m/m;
    if(!k) puts("0"),exit(0);
    for(lol i=1;i<=n;i++) {
        AQ=(2*(n-i+1)*i-1)*base;
        for(lol j=1;j<=m;j++) {
            double res=1.0,p=1.0-AQ*(2*(m-j+1)*j-1);
            int x=k;
            while(x) {
                if(x&1) res*=p;
                x>>=1,p*=p;
            }ans+=1.0-res;
        }
    }
    cout<<(lol)(ans+0.5)<<endl;//四舍五入
}

博主蒟蒻,随意转载.但必须附上原文链接

http://www.cnblogs.com/real-l/

原文地址:https://www.cnblogs.com/real-l/p/9756006.html