zoukankan      html  css  js  c++  java
  • CSUOJ 1009 抛硬币

    Description

    James得到了一堆有趣的硬币,于是决定用这些硬币跟朋友们玩个小游戏。在一个N行M列的表格上,每一个第i行第j列的格子上都放有一枚James的硬币,抛该硬币正面朝上的概率为Pij,所有抛硬币事件两两之间是相互独立的。

    现在,玩家在M列硬币中,从每一列里各选择1枚,共M枚,构成一组。如此重复选择N组出来,且保证被选择过的硬币不能再选。选好组之后,每组的M枚硬币各抛一次,如果都是正面朝上,则该组胜利,总分赢得1分;否则该组失败,总分不加也不减。请问,如果让你自行选择硬币的分组,游戏总得分的数学期望的最大值是多少?

    Input

    输入有多组数据。每组数据第一行为N和M,1≤N≤100,1≤M≤10,以空格分隔。接下来有N行,每行M个小数,表示表格中对应的Pij

    输入以N=M=0结束,这组数据不输出结果。

    Output

    对于每组数据,输出对应游戏总得分的数学期望的最大值,四舍五入精确至4位小数。每组数据的输出占一行。

    Sample Input

    2 3
    1.0 1.0 1.0
    0.5 0.4 0.3
    0 0
    

    Sample Output

    1.0600

    Hint

    计算期望
    #include<stdio.h>
    #include<string>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int m, n;
    double map[15][110];
    int main()
    {
    	while (~scanf("%d%d", &n, &m))
    	{
    		if (!m && !n)
    			break;
    		for (int i = 0; i < n; i++)
    		{
    			for (int j = 0; j < m; j++)
    			{
    				scanf("%lf", &map[j][i]);//注意这里 i j 的位置
    			}
    		}
    		for (int i = 0; i < m; i++)
    			sort(map[i], map[i] + n);
    		double sum = 0;
    		for (int i = 0; i < n; i++)
    		{
    			double cnt = 1;
    			for (int j = 0; j < m; j++)
    				cnt *= map[j][i];
    			sum += cnt;
    		}
    		printf("%.4lf
    ", sum);
    	}
    
    	return 0;
    }
    
    /**********************************************************************
    	Problem: 1009
    	User: leo6033
    	Language: C++
    	Result: AC
    	Time:4 ms
    	Memory:2036 kb
    **********************************************************************/
    


  • 相关阅读:
    一次有教益的程序崩溃调试 (中)
    读书:手工测试与自动测试
    迭代还是交付?
    用Windbg调试.NET程序的资源泄漏
    一次有教益的程序崩溃调试 (上)
    基于云计算的软件测试服务
    Vcastr 3.0 api
    学习Linux三(Linux常用命令及技巧)
    学习Linux六(Linux必学60个命令之【文件处理】)
    学习Linux四(Linux必学60个命令)
  • 原文地址:https://www.cnblogs.com/csu-lmw/p/9124450.html
Copyright © 2011-2022 走看看