Lights inside a 3d Grid UVA - 11605(概率)

题意:

  给出一个n * m * h的空间 每次任意选择两个点  使得在以这两个点连线为对角线的空间的点的值 取反  (初始为0) 求经过k次操作后最后有多少点的值为1

解析:

  遇到坐标分维去看  把三维的坐标轴分别在x轴  y轴  z轴去看

  设p为一次操作能把这个点包含在操作的区域内的概率

  因为每个点都是独立的 所以去考虑每一个点经过k次操作后的状态, 设f[i]为经过i次操作过后一个点为1的概率 g[i]为这个点为0的概率 则  f[i] + g[i] = 1  且    f[i] = f[i-1] * (1 - p) + g[i] * p

  那么化简一下  则f[i] = f[i-1] * (1 - 2 * p) + p; 

  然后高中知识化简一下  f[i] = 0.5 - pow(1 - 2 * p, q) / 2;

  因为每个点都是独立的所以 sum(f[i] * 1) + sum((1 - f[i]) * 0) 即为期望的次数
  
 
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <cctype>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <bitset>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define lap(i, a, n) for(int i=n; i>=a; i--)
#define lep(i, a, n) for(int i=n; i>a; i--)
#define rd(a) scanf("%d", &a)
#define rlld(a) scanf("%lld", &a)
#define rc(a) scanf("%c", &a)
#define rs(a) scanf("%s", a)
#define pd(a) printf("%d\n", a);
#define plld(a) printf("%lld\n", a);
#define pc(a) printf("%c\n", a);
#define ps(a) printf("%s\n", a);
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = 10010, INF = 0x7fffffff, LL_INF = 0x7fffffffffffffff;

double cal(int l, int r)
{
    return r * r - (l - 1) * (l - 1) - (r - l) * (r - l);   //用两次选择总的情况减去 直选左边的或者直选右边的情况
}

int main()
{
    int T, n, m, h, q, kase = 0;
    rd(T);
    while(T--)
    {
        rd(n), rd(m), rd(h), rd(q);
        double down = (double)n * n * m * m * h * h;
        double res = 0;
        rap(i, 1, n)
            rap(j, 1, m)
                rap(k, 1, h)
                {
                    double p = cal(i, n) * cal(j, m) * cal(k, h) / (double)down;
                    res += 0.5 - pow(1 - 2 * p, q) / 2;
                    //cout << res << endl;
                }
        printf("Case %d: %.10f\n", ++kase, res);
    }


    return 0;
}

 

  

  

posted @ 2018-09-27 14:08  WTSRUVF  阅读(144)  评论(0编辑  收藏  举报