1. 程式人生 > >UVa679 小球下落(樹)

UVa679 小球下落(樹)

true -a alt text 16px 深度 end esp 所有

UVa679 小球下落(樹)

題目大意

小球從一棵所有葉子深度相同的二叉樹的頂點開始向下落,樹開始所有節點都為0。若小球落到節點為0的則往左落,否則向右落。並且小球會改變它經過的節點,0變1,1變0。給定樹的深度D和球的個數I,問第I個小球會最終落到哪個葉子節點。

題意容易理解,紫書上給了一個模擬的做法,但這樣會超時。後面的想法我覺得很巧妙。

每個小球都會落入根節點,第一個小球一定是向左,第二個向右,所以只看小球編號的奇偶性就可以知道它最終是落在哪一棵子樹中。對於進入左子樹的小球,通過判斷其奇偶性也可以判斷它會繼續向左還是向右。依此類推,直到小球落到葉子上。

 1 #include<iostream>
 2
using namespace std; 3 int main() 4 { 5 int n; 6 while(cin>>n && n != -1) 7 { 8 while(n--) 9 { 10 int D,I;///D為葉子深度,I為小球個數 11 cin>>D>>I; 12 int deep = 1; 13 int ans = 1; 14 while(true
) 15 { 16 deep++; 17 if(I%2)///第一個進入 18 { 19 ans *= 2;///向左走 20 I = (I + 1)/2; 21 }else{///第二個進入 22 ans = ans*2 + 1; 23 I = I/2; 24 } 25 if
(deep == D)///到達葉子節點 26 { 27 cout<<ans<<endl; 28 break; 29 } 30 } 31 } 32 } 33 34 return 0; 35 }

技術分享圖片

UVa679 小球下落(樹)