UVa 679 - Dropping Balls【二叉樹】【思維題】
阿新 • • 發佈:2018-03-31
get title lld -s round () color 直接 2個
題目鏈接
題目大意:
小球從一棵所有葉子深度相同的二叉樹的頂點開始向下落,樹開始所有節點都為0。若小球落到節點為0的則往左落,否則向右落。並且小球會改變它經過的節點,0變1,1變0。給定樹的深度D和球的個數I,問第I個小球會最終落到哪個葉子節點。
解題思路:
完全二叉樹有一個重要的性質:對於任意一個節點k,其左節點、右節點的編號分別為2k和2k+1
對於根節點,很容易知道當球的編號為奇數時,球落入左子樹,偶數時落在右子樹。這樣其實對於其它節點看成根節點時也是一樣的。比如對於第7個球,為奇數,是第7個到達一號節點的球,也是第(7/2)+1=4個到達2號節點球,再往下也是第2個到達5號節點的球。。。。
所以可以直接通過找規律,模擬最後一個球的判斷過程
#include <cstdio> typedef long long ll; ll d, n; int main() { int cur; while (scanf("%d", &cur) != EOF,cur!=-1) { while (cur--) { scanf("%lld%lld", &d, &n); int height = 1; ll num = 1;while (height < d) //從深度為1的根節點到達深度為d的葉子總共需要判斷d-1次 { if (n % 2 == 0) //當球的編號為偶數的時候 { num = num * 2 + 1; n = n / 2; height++; } else //當球的編號為奇數的時候{ num = num * 2; n = (n + 1) / 2; height++; } } printf("%lld\n", num); } } return 0; }
2018-03-31
UVa 679 - Dropping Balls【二叉樹】【思維題】