csu 1009 抛硬币

C - 抛硬币 CSU - 1009

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

题意:输入一个n行m列的矩阵,每个数代表概率,想得到最大期望,而得分结果为1,即每次优先最大的概率相乘,局部最优,用贪心思想。

     在没列上排序,选取最大的概率,在行上相乘,再将每行的结果相加即可。

注意:要将矩阵转置才能正确sort排序,因为二维数组a[][]的第一个下标永远是行标。

#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
const int maxn=1005;

double a[maxn][maxn];
double tmp[maxn][maxn];

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m),n|m)
    {
        memset(a,0,sizeof(a));
        memset(tmp,0,sizeof(tmp));
        ///输入 n 行 m 列的矩阵
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                scanf("%lf",&a[i][j]);
            }
        }

        ///转置为 m行 n 列的矩阵
       for(int j=0;j<m;j++)
       {
           for(int i=0;i<n;i++)
           {
               tmp[j][i]=a[i][j];
           }
       }
        ///排序
        for(int i=0;i<m;i++)
        {
            sort(tmp[i],tmp[i]+n);
        }

        ///输出转置后的矩阵变为 m行 n 列的矩阵
        /*for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                printf("%.1lf ",tmp[i][j]);
            }
            printf("\n");
        }*/

        double sum=0,mad;
        for(int i=0;i<n;i++)
        {
            mad=1;
            for(int j=0;j<m;j++)
            {
                mad*=tmp[j][i];///在列上相乘
            }
            sum+=mad;///每列结果相加
        }
        printf("%.4lf\n",sum);
    }

    return 0;
}
时间: 2024-08-27 17:04:51

csu 1009 抛硬币的相关文章

抛硬币的两种思维方式

抛硬币是经典统计学中最基础的案例,无论是理论还是实验,都证明了50%这个概率,而且抛的次数越多,越接近这个值. 我们来看看一下这个问答:(以下对话例子来源于塔勒布的<黑天鹅>) A:假设硬币是公平的,因为每次抛出硬币得到正面与反面的可能性都是相同的.我把它抛出了99次,每次都正好得到正面.那么,我下一次得到反面的概率是多大? 回答者1(统计学家):毫无疑问,当然是50%,因为统计学中的样本独立性,不管你前面得到了什么结果,与下一次的结果都无关,所以可能性依然是50%. 好吧,对于学过统计的人,

模拟抛硬币(C语言实现)

实现代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int heads() 5 { 6 return rand() < RAND_MAX/2; 7 } 8 9 int main(int argc, char *argv[]) 10 { 11 int i,j,cnt; 12 int N = atoi(argv[1]), M = atoi(argv[2]); 13 int *f = malloc((N+1)*sizeof(int)

[AH/HNOI2017]抛硬币

题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A 为了劝说小 B 早日脱坑,认真学习,决定以抛硬币的形式让小 B 明白他是一个彻彻底底的非洲人,从而对这个游戏绝望.两个人同时抛 b 次硬币,如果小 A 的正面朝上的次数大于小 B 正面朝上的次数,则小 A 获胜. 但事实上,小 A 也曾经沉迷过拉拉游戏,而且他一次 UR 也没有抽到过,所以他对于自

抛硬币 Flipping Coins(Gym - 101606F)

Here's a jolly and simple game: line up a row of N identical coins, all with the heads facing down onto the table and the tails upwards, and for exactly K times take one of the coins, toss it into the air, and replace it as it lands either heads-up o

【刷题】BZOJ 4830 [Hnoi2017]抛硬币

Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为了劝说小B早日脱坑,认真学习,决定以抛硬币的形式让小B明白他是一个彻彻底底的非洲人,从而对这个游戏绝望.两个人同时抛b次硬币,如果小A的正面朝上的次数大于小B正面朝上的次数,则小A获胜.但事实上,小A也曾经沉迷过拉拉游戏,而且他一次UR也没有抽到过,所以他对于自己的运气也没有太大把握.所以他决定在小

抛硬币问题

每次抛掷硬币正面向上和反面向上的概率是相同的 问题 1 :抛掷硬币 n 次,求连续 k 次正面向上的方案数有多少种 ? 一个比较好想的点子是直接 2^n 枚举,在这其中寻找符合要求的有多少种,复杂度爆表... 在计算连续 k 次正面向上的方案数可能并不太好算,那么就转换成 用总的方案数减去仅有连续小于 k 次的方案数 dp[i] 表示 到第 i 个位置仅存在小于连续 k 次正面向上的方案数 1 . 当 i < k 时, dp[i] = dp[i-1]*2 2 . 当 i == k 时, dp[i

用随机数列模拟抛硬币

先粘贴上代码 package djbc; import java.util.Random;import java.util.Scanner; public class Lian {public static void main(String[] args) {int i=0,k=0,t=0;  System.out.println("请输入要抛的次数");Scanner scan=new Scanner(System.in);//输入抛硬币的次数t=scan.nextInt();Ran

HZOI20190908模拟40 队长快跑,影魔,抛硬币 题解

题面:https://www.cnblogs.com/Juve/articles/11487699.html 队长快跑: 权值线段树与dp yy的不错 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int MAXN=1e5+5; int n,a[MAXN],b[

抛硬币直到连续2次正面的概率

前两天去面了个试,被一个经典的概率题目(很早以前听过,然而全忘记了)难住了. 一个硬币,抛到head的概率是0.5,需要抛多少次(期望次数)才能连续抛出2次(n次)head? 假设期望次数为N,要连续2次得到head,至少得抛2次.那么要得到连续两次head,会有下面三种情况.1,第一次不是head,2,两次都不是head,3,连续两次是head,则有: N=0.5*(1+N)+0.5*0.5*(1+1+N)+0.5*0.5*2 上式可以解出N=6 要推广到任意连续n次head的情况,应该可以用