【題目描述】
有乙個三角形木板,豎直立放,上面釘著n(n+1)/2顆釘子,還有(n+1)個格仔(當n=5時如圖1)。每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。
讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球每碰到乙個釘子都可能落向左邊或右邊(概率各1/2),且球的中心還會正對著下一顆將要碰上的釘子。例如圖2就是小球一條可能的路徑。
現在的問題是計算拔掉某些釘子後,小球落在編號為m的格仔中的概率pm。假定最下面一排釘子不會被拔掉。例如圖3是某些釘子被拔掉後小球一條可能的路徑。
【輸入描述】
第1行為整數n(2<=n<=50)。
以下n行依次為木板上從上至下n行釘子的資訊,每行中『*』表示釘子還在,『.』 表示釘子被拔去(最下面一排的釘子不會拔掉),注意在這n行中空格符可能出現在任何位置。
【輸出描述】
共n+1行,每一行是乙個既約分數(0寫成0/1),為小球落在編號為0到編號為n這n+1個的格仔中的概率m。
既約分數的定義:a/b是既約分數,當且僅當a、b為正整數且a和b沒有大於1的公因子。
【樣例輸入】4*
* ** . *
* * * *
【樣例輸出】
1/16
1/85/8
1/81/16
【資料範圍及提示】
(2<=n<=50)
源**:#include
using
namespace
std;
long
long n,i1[61][61]=,i2[61][61]=; //
long long甚至也會爆掉!還得用cin、cout!
bool f[61][61]=;
void x1(long
long &x1,long
long &y1,long
long x2,long
long y2) //
輾轉相除法進行坑爹的處理。
else
long
long t=(y1*y2)/t2;
t1=x1*(t/y1)+x2*(t/y2);
t2=t;
x1=t1;
y1=t2;
while (t1%t2)
if (!(x1%t2))
}}int
main()
for (int a=1;a<=n+1;a++)
f[n+1][a]=true
;
if (f[1][1
]) i1[
1][1]=i2[1][1]=1
;
else
if(f[t1][t2])
x1(i1[t1][t2],i2[t1][t2],
2,1);
}for (int a=1;a)
for (int b=1;b<=a;b++)
if(f[t1][t2])
x1(i1[t1][t2],i2[t1][t2],i1[a][b],i2[a][b]);
}if (f[a+1][b+1
]) x1(i1[a+1][b+1],i2[a+1][b+1
],i1[a][b],i2[a][b]);
else
if(f[t1][t2])
x1(i1[t1][t2],i2[t1][t2],i1[a][b],i2[a][b]);}}
for (int a=1;a<=n;a++)
for (int a=1;a<=n+1;a++)
if (i1[n+1
][a])
cout
<1][a]<
<1][a]<
else
cout
<
0/1"
<
return0;
} //
水完這道題整個人都不好了。
poj 1189 釘子和小球
題目大意 乙個三角形木板,豎直立放,上面釘著n n 1 2顆釘子,還有 n 1 個格仔 當n 5時如圖1 每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球...
poj 1189 釘子和小球 DP
有乙個三角形木板,豎直立放,上面釘著n n 1 2顆釘子,還有 n 1 個格仔 當n 5時如圖1 每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球每碰到乙...
釘子與木板
3.釘子與木板 30分 問題背景 牆上有n個釘子,編號為1,2,n。其中釘子i的橫座標為i,縱座標初始為xi。可以進行兩種操作 0 k v 豎直移動釘子k,座標變為 k,v 1 s t v 若在高度為v處放一塊橫座標範圍是 s,t 的水平木板,它將下落到什麼高度?換句話說,求出釘子s,s 1,s 2...