题目地址: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 1 1 0 1 1 2 6
样例输出
8.000000 8.000000 12.000000 48.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 1000000007
using 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]);
}
}