南华大学个人练习第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个管子右边掉下去,要求小球从最后一行各个出口掉出来的概率。 

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<iostream>
#include<cstring>
#include<iomanip>
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<m; j++)
            {
                Arr[i+2][j]=(Arr[i+1][j]+Arr[i+1][j+1])*0.5;
            }
        }
        for(i=1; i<m; i++)
        {
            cout<<setprecision(6)<<fixed<<Arr[2*n-1][i];
            if(i<m-1)
                cout<<' ';
        }
        cout<<endl;

    }
    return 0;
}

 
 
 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值