Problem D: 弹球II
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 27 Solved: 11
[ Submit][ Status][ Web Board]
Description
游戏厅里有一种很常见的游戏机,里面有很多根管子有规律地排成许多行。小球从最上面掉下去,碰到管子会等概率地往管子左边或者右边的空隙掉下去。不过在最靠边的小球只会往一边掉(如图,灰色小球只可能掉到右边空隙)。现在已知共2 * n - 1行管子,第i行有Ai个管子,如果i是奇数,那么Ai等于m,如果i是偶数,Ai等于m - 1。小球从第1行第k个管子右边掉下去,要求小球从最后一行各个出口掉出来的概率。
Input
第一行是一个整数t(1≤t≤50),表示有t组测试数据。
每组数据第一行有两个整数n(1≤n≤100)和m(2≤m≤10),表示有2*n-1行管子,奇数行有m个管子,偶数行有m-1个管子。
第二行是一个整数k(1≤k≤m-1),表示小球从第1行第k个管子右边掉下去。
Output
输出m-1个小数,第i个数表示小球从最后一行第i个出口出来的概率。
每个小数保留小数点后六位,小数与小数之间用一个空格隔开。
Sample Input
Sample Output
#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;
}