小球下落 UVa 679 6 3 1

2021-10-04 15:04:39 字數 921 閱讀 5442

小球下落

有一棵二叉樹,最大深度為d,且所有的葉子深度都相同。所有的結點從上到下從左到右編號為1,2,3,4…,2^d-1。在結點1處放乙個小球,它會往下落。每個內結點上都有乙個開關,初始全部關閉,當每次有小球落到乙個開關上時,狀態都會改變。當小球到達乙個內結點時,如果該節點上的開關關閉,則往左走,否則往右走,直到走到葉子結點。一些小球從節點1處依次開始下落,最後乙個小球將會落到**呢》輸入葉子深度和小球個數i,輸出第i個小球最後所在的葉子編號。假設i不超過整棵樹的葉子個數,d<=20,輸入包含1000組資料。

樣例輸入

4 23 4

10 1

2 28 128

16 12345

樣例輸出127

5123

25536358

題記

用陣列存放每個結點的開關狀態模擬出每個小球的下落過程是一般思路,可以解決,但是計算量太大,如果d=20而且有1000組資料肯定要tle了,所以我們可以只模擬最後乙個小球的下降過程。小球每經過乙個結點就會改變開關狀態,如果當前這個小球經過這個結點(可以假設這裡相當乙個關卡,有個門衛把守,他會根據你是第奇數個還是偶數個來到這的小球,讓你往左或者往右),如果你這個小球是第奇數個經過這裡的小球,那你往左,第偶數個就往右。每一層都是這樣的,這樣一來乙個for迴圈就能解決了。

**如下

#include

#include

using

namespace std;

intmain()

else

printf

("%d\n"

,k);

}return0;

}

小球下落 UVa 679

問題描述 有一棵二叉樹,最大深度為d,且所有葉子的深度都相同。所有結點從上到下從左到右編號為1,2,3,2d 1。在結點1處放乙個小球,它會往下落。每個內結點上都有乙個開關,初始全部關閉,當每次有小球落到乙個開關上時,狀態都會改變。當小球到達乙個內結點時,如果該結點上的開關關閉,則往左走,否則往右走...

UVa679 小球下落(樹)

給下落的深度和小球個數,小球依次下落,結點有個開關,每到乙個結點,開關關向左,開向右 一開始想到了簡單模擬,結果超時 include include include define maxn 20 using namespace std int s 1 printf d n now 2 return ...

23 小球下落(UVa679)

有一棵二叉樹,最大深度為d,且所有的葉子深度都相同。所有結點從上到下從左到右編號為1,2 3,2d 11,2,3,2 d 1 1,2,3,2d 1。在結點1處放乙個小球,它會往下落。每個結點上都有乙個開關,初始全部關閉,當每次有小球落到乙個開關上時,它的狀態都會改變。當小球到達乙個內結點時,如果該結...