• 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;
    }
    



  • 相关阅读:
    python之路----初识面向对象(二)
    python之路----初识面向对象
    python之路----包
    python之路----模块与序列化模块
    python之路----模块调用
    python之路----常用模块二
    Python之路----递归函数
    Python之路----内置函数
    【CSS】整屏大背景
    【PHP】打印输出var_dump+echo+print_r
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/5173955.html
Copyright © 2020-2023  润新知