zoukankan      html  css  js  c++  java
  • UVA 11605 Lights inside a 3d Grid —— (概率和期望)

      题意:见大白书P181。

      分析:一个一个点的进行分析,取其期望然后求和即可。假设当前点在第一次中被选到的概率为p,f[i]表示进行k次以后该点亮的概率(在这里也可以理解为期望),g[i]表示k次后该点不亮的概率,那么联立:

        1.f[1] = p;

        2.f[i] + g[i] = 1.0;

        3.f[i] = f[i-1] * (1-p) + g[i-1] * p;

      上面三个式子都很好理解。然后借助一下高中推数列的方法,可以推得:f[i] = 1/2-1/2*(1-2*p)^i。

      那么,我们该怎么求p呢。不妨把三维分解成三个一维,那么,一个维度(即线段)上求的方法如下:

        假设这个维度的长度是len,总的可能种数是len*len(因为题目没规定A和B两点之间坐标的大小,因此反过来的情况也必须算上),同理可以计算得    到包含了这个点的线段总数,后者除以前者即可得到该维度下的p'。

      然后三个维度的p'相乘即可得到p。

      最后O(n^3)枚举点并累和即可解决该问题。

      代码如下:

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <string.h>
     4 #include <math.h>
     5 using namespace std;
     6 
     7 int n,m,p,k;
     8 // f表示某个点,该点被选到的概率为x,其经过k次以后能亮的概率
     9 double f(double x)
    10 {
    11     return 0.5 - 0.5 * pow((1-2*x), k);
    12 }
    13 
    14 // get表示分解后的某条轴上这个点被选到的概率
    15 double get(int x,int len)
    16 {
    17     // -1 是因为两个点都在x这个位置这种情况被多算了一次
    18     return (2.0*x*(len-x+1) - 1) / (1.0*len*len);
    19 }
    20 
    21 int main()
    22 {
    23     int T;
    24     scanf("%d",&T);
    25     for(int kase=1;kase<=T;kase++)
    26     {
    27         scanf("%d%d%d%d",&n,&m,&p,&k);
    28         double ans = 0.0;
    29         for(int i=1;i<=n;i++)
    30         {
    31             double nn = get(i, n);
    32             for(int j=1;j<=m;j++)
    33             {
    34                 double mm = get(j, m);
    35                 for(int z=1;z<=p;z++)
    36                 {
    37                     ans += f(nn * mm * get(z, p));
    38                 }
    39             }
    40         }
    41         printf("Case %d: %.15f
    ",kase,ans);
    42     }
    43     return 0;
    44 }

       值得注意的是,这题下k的范围是1e4,如果k更大例如1e9,那么就不能用数学方法直接算出表达式了,因为带个pow复杂度毕竟是较高的,应当使用矩阵快速幂来直接递推。

  • 相关阅读:
    HDFS常用命令总结
    mac 安装zmap
    使用scrapy-redis搭建分布式爬虫环境
    xpath选择兄弟节点、返回上一级和选择多个属性
    什么是套接字(Socket)
    socket编程——一个简单的例子
    python之 __getattr__、__getattr__、__getitem__、__setitem__ 使用
    如何快速转载文章
    如何让类也变成可以迭代的对象
    leecode 第二题 简单
  • 原文地址:https://www.cnblogs.com/zzyDS/p/6657001.html
Copyright © 2011-2022 走看看