zoukankan      html  css  js  c++  java
  • HDU 5570:balls 期望。。。。。。。。。。。。。。。

    balls

     
     Accepts: 19
     
     Submissions: 55
     Time Limit: 6000/3000 MS (Java/Others)
     
     Memory Limit: 65536/65536 K (Java/Others)
    问题描述
    nn个球,共有mm种颜色,第ii个球的颜色为jj的概率为frac{a_{i,j}}{a_{i,1}+a_{i,2}+...+a_{i,m}}ai,1+ai,2+...+ai,mai,j。
    对于第ii种颜色,若有xx个球,对答案的贡献为x^{2}x2。
    问答案的期望。
    
    输入描述
    若干组数据(大概55组)。
    每组数据第一行两个整数n(1 leq n leq 1000), m(1 leq m leq 1000)n(1n1000),m(1m1000)。
    接下来nn行每行mm个数表示a_i,j(1 leq a_i,j leq 100)ai,j(1ai,j100)
    
    输出描述
    对于每组数组,输出一行表示答案,保留两位小数。
    
    输入样例
    2 2
    1 1
    3 5
    2 2
    4 5
    4 2
    2 2
    2 4
    1 4
    
    输出样例
    3.00
    2.96
    3.20

    val[i][j]表示第i个球颜色为j的概率。那么第i个球颜色为j的期望E[x[i][j]]=val[i][j]*1+(1-val[i][j])*0=val[i][j]

    c[i]表示颜色为i的球的个数。题目要求的是 sum(E[c[i]^2]) i的值从1到m。


    从最简单的来看 如果要求的是E[c[i]],那么它等于E[(x[1][i]+x[2][i]...+x[n][i])]

    现在要求的是E[c[i]^2]=E[(x[1][i]+x[2][i]...+x[n][i])^2]。

    里面展开的话就是任意两个相乘,拿出其中一项来看 E[x[k1][i]*x[k2][i]] 

    若k1==k2,那这个等式等于=val[k1][i]

    若k1!=k2,那这个等式等于=val[k1][i]*val[k2][i]

    求和即是结果了。

    代码:

    #pragma warning(disable:4996)  
    #include <iostream>  
    #include <algorithm>  
    #include <cmath>  
    #include <vector>  
    #include <string>  
    #include <cstring> 
    #include <queue>
    using namespace std;
    
    const int maxn = 1005;
    
    int n, m;
    double val[maxn][maxn];
    
    int main()
    {
        //freopen("i.txt", "r", stdin);
        //freopen("o.txt", "w", stdout);
        
    
        while (scanf("%d%d", &n, &m) != EOF)
        {
            for (int i = 1; i <= n; i++)
            {
                double sum = 0;
                for (int j = 1; j <= m; j++)
                {
                    scanf("%lf", &val[i][j]);
                    sum += val[i][j];
                }
                for (int j = 1; j <= m; j++)
                {
                    val[i][j] = val[i][j] / sum;
                }
            }
            double ans = 0;
            for (int i = 1; i <= m; i++)
            {
                double sum = 0;
                for (int j = 1; j <= n; j++)
                {
                    sum += val[j][i];
                    ans += val[j][i];
                    ans -= val[j][i] * val[j][i];
                }
                ans += (sum*sum);
            }
            printf("%.2lf
    ", ans);
        }
        //system("pause");
        return 0;
    }
    



  • 相关阅读:
    Golang 学习入坑(三)Go语言变量及常量及运算符
    Golang 学习入坑(二)Go语言结构及基本语法及基本类型
    docker 理解和一些应用
    golang学习入坑(一)Go介绍及环境搭建
    VMware安装Centos7超详细程
    2020-05-28 postgresql sequence
    2020-05-18 缓存穿透、缓存击穿、缓存雪崩
    2020-05-15 rocketmq-spring-starter支持多集群
    2020-05-15 rocketmq-spring-starter结合disconf使用
    2020-05-14 RSA加解密
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/5173955.html
Copyright © 2011-2022 走看看