1. 程式人生 > >UVa 679 - Dropping Balls【二叉樹】【思維題】

UVa 679 - Dropping Balls【二叉樹】【思維題】

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【二叉樹】【思維題】