南华大学个人练习第4场 Problem D: 弹球II

Problem D: 弹球II

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 27   Solved: 11
[ Submit][ Status][ Web Board]

Description

游戏厅里有一种很常见的游戏机,里面有很多根管子有规律地排成许多行。小球从最上面掉下去,碰到管子会等概率地往管子左边或者右边的空隙掉下去。不过在最靠边的小球只会往一边掉(如图,灰色小球只可能掉到右边空隙)。现在已知共2 * n - 1行管子,第i行有Ai个管子,如果i是奇数,那么Ai等于m,如果i是偶数,Ai等于m - 1。小球从第1行第k个管子右边掉下去,要求小球从最后一行各个出口掉出来的概率。 
南华大学个人练习第4场 Problem D: 弹球II_第1张图片

Input

第一行是一个整数t1≤t≤50),表示有t组测试数据。 
每组数据第一行有两个整数n1≤n≤100)和m2≤m≤10),表示有2*n-1行管子,奇数行有m个管子,偶数行有m-1个管子。 
第二行是一个整数k1≤k≤m-1),表示小球从第1行第k个管子右边掉下去。 

Output

输出m-1个小数,第i个数表示小球从最后一行第i个出口出来的概率。 
每个小数保留小数点后六位,小数与小数之间用一个空格隔开。 

Sample Input

1 3 3 2

Sample Output

0.375000 0.625000
 
 
这是一道求概率的题目。
题目要我们求的是小球从最后一行每个洞出来的概率,我们可以这样想,因为第一行已经给出了从第几个洞进去,所以我们只要从第二行开始计算,又因为奇数行有m根管子,m-1个洞,偶数行有m-1根管子,m个洞。在这里我们可以用一个二维数组来存储这些概率,只要找到规律,这道题目就简单了。直接用for循环就可以求出来了。
下面是我的代码:

#include
#include
#include
using namespace std;

double Arr[202][11];

int main(void)
{
    int T;
    cin>>T;
    while(T--)
    {
        memset(Arr,0,sizeof(Arr));
        int n,m;
        int k;
        int i,j;
        cin>>n>>m;
        cin>>k;
        Arr[1][k]=1.0;
        for(i=1; i<2*n-1; i+=2)
        {
            for(j=1; j<=m; j++)
            {
                Arr[i+1][j]=(Arr[i][j-1]+Arr[i][j])*0.5;
            }
            Arr[i+1][1]*=2.0;
            Arr[i+1][m]*=2.0;
            for(j=1; j             {
                Arr[i+2][j]=(Arr[i+1][j]+Arr[i+1][j+1])*0.5;
            }
        }
        for(i=1; i         {
            cout<             if(i                 cout<<' ';
        }
        cout<

    }
    return 0;
}

 
 
 
 
 

你可能感兴趣的:(南华大学个人练习第4场 Problem D: 弹球II)