zoukankan      html  css  js  c++  java
  • LightOJ1284 Lights inside 3D Grid (概率DP)

    You are given a 3D grid, which has dimensions XY and Z. Each of the X x Y x Z cells contains a light. Initially all lights are off. You will have K turns. In each of the K turns,

    1. You select a cell A randomly from the grid,
    2. You select a cell B randomly from the grid and
    3. Toggle the states of all the bulbs bounded by cell A and cell B, i.e. make all the ON lights OFF and make all the OFF lights ON which are bounded by A and B. To be clear, consider cell A is (x1, y1, z1) and cell B is (x2, y2, z2). Then you have to toggle all the bulbs in grid cell (x, y, z) where min(x1, x2) ≤ x ≤ max(x1, x2)min(y1, y2) ≤ y ≤ max(y1, y2) and min(z1, z2) ≤ z ≤ max(z1, z2).

    Your task is to find the expected number of lights to be ON after K turns.

    Input

    Input starts with an integer T (≤ 50), denoting the number of test cases.

    Each case starts with a line containing four integers X, Y, Z (1 ≤ X, Y, Z ≤ 100) and K (0 ≤ K ≤ 10000).

    Output

    For each case, print the case number and the expected number of lights that are ON after K turns. Errors less than 10-6will be ignored.

    Sample Input

    5

    1 2 3 5

    1 1 1 1

    1 2 3 0

    2 3 4 1

    2 3 4 2

    Sample Output

    Case 1: 2.9998713992

    Case 2: 1

    Case 3: 0

    Case 4: 6.375

    Case 5: 9.09765625

    题解:

    参考代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int T,X,Y,Z,K;
    double ans;
    
    double calc(int x,int m)
    {
        return 1.0-1.0*((m-x)*(m-x)+(x-1)*(x-1))/(m*m);
    }
    
    int main()
    {
        scanf("%d",&T);
        for(int cas=1;cas<=T;++cas)
        {
            ans=0;
            scanf("%d%d%d%d",&X,&Y,&Z,&K);
            for(int i=1;i<=X;++i)
                for(int j=1;j<=Y;++j)
                    for(int k=1;k<=Z;++k)
                    {
                        double p=calc(i,X)*calc(j,Y)*calc(k,Z);
                        ans+=0.5-0.5*pow(1.0-2*p,K);
                    }
            printf("Case %d: %.8lf
    ",cas,ans);
        } 
        
        return 0; 
    }
    View Code
  • 相关阅读:
    linux c dlopen加载动态链接库
    c++锁 测试 (gcc test.cpp -o test -lpthread)
    shell 清理目录下 超过一段时间的数据。
    大话存储学习笔记
    python总结
    正则表达式使用
    #linux shell#模拟日志生成过程
    深入理解Java虚拟机
    Nginx修改access.log日志时间格式
    mfcs100d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined
  • 原文地址:https://www.cnblogs.com/csushl/p/10828658.html
Copyright © 2011-2022 走看看