XTU 1193 Lucky Wheel 概率递推

来源:互联网 发布:艾弗森数据 编辑:程序博客网 时间:2024/04/29 01:32

题目地址:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1193

题目描述

Alice在玩Bob的幸运大转盘,转盘如图。每次转完有8种结果,得到每种结果的概率是一样的。Bob说只要Alice能收集够x个一等奖和y二等奖就请他吃大餐。但是Alice每转一个要给Bob一块钱。现在Alice请你帮他计算一下他要转出x个一等奖和y个二等奖一共要转的次数的期望。

输入

输入包含不超过10000组数据。每组数据占一行,有两个整数x,y,(0 < x,y < 1000)。直到文件结束。

 

输出

输出一行,一个数表示Alice要转次数的期望,结果保留6位小数。

样例输入

0 11 01 12 6

样例输出

8.0000008.00000012.00000048.625000

这儿是湘潭大学2014年4月12日月赛的一道题。
题目意思狠明确,要求求期望。

当时是最后30秒过的这题,所以印象很神。

思路大概就是你有x个二等奖y个一等奖要拿,那么
1)当x或者y有一个为0时,那么就转8次会x-1或y-1
2)当x和y均不为0时,那么转4次就会x-1或y-1

那么很明显,当a[x][y]是由a[x-1][y]和a[x][y-1]决定的
下面看代码:

#include <stdio.h>#include <fstream>#include <string.h>#include <iostream>#include <math.h>#include <algorithm>#include <vector>#include <map>#define PI acos(-1.0)#define M 1000005  //10^6#define eps 1e-8#define moo 1000000007using namespace std;double a[5000][5000];int main(){    int i,j,d;    a[0][0]=0;    for(d=1;d<=2000;d++)    //用d标记层数,d=i+j,即总共需要拿多少奖。    {        for(i=0;i<=d&&i<=1000;i++)        {            if(d-i<=1000)            {                j=d-i;                if(i==0||j==0)                {                    a[i][j]=i*8+j*8;  //情况一                }                else                {                    a[i][j]=4+a[i][j-1]/2+a[i-1][j]/2;  //因为一等奖二等奖概率相等,所以直接都乘50%,如果不等,那么分开乘就好。                }            }        }    }    while(scanf("%d%d",&i,&j)!=EOF)    {        printf("%lf\n",a[i][j]);    }}


0 0
原创粉丝点击