3.小球

小球

Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 18 Accepted Submission(s) : 5

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

許多的小球一個一個的從一棵滿二叉樹上掉下來組成FBT(Full Binary Tree,滿二叉樹),每一時間,一個正在下降的球第一個訪問的是非葉子結點。然後繼續下降時,或者走左子樹,或者走右子樹,直到訪問到葉子結點。決定球運動方向的是每個結點的布爾值。最初,所有的結點都是false,當訪問到一個結點時,如果這個結點是false,則這個球把它變成true,然後從左子樹走,繼續它的旅程。如果結點是true,則球也會改變它爲false,而接下來從右子樹走。
對於一個有15個結點的滿二叉樹。因爲所有的結點最初爲false,所以第一個球將會訪問結點1、結點2和結點4,轉變結點的布爾值後在結點8停止。第二個球將會訪問結點1、3、6,在結點12停止。明顯地,第三個球在它停止之前,會訪問結點1、2、5,在結點10停止。
現在你的任務是,給定FBT的深度D和I,I表示第I個小球下落,你可以假定I不超過給定的FBT的葉子數,求小球停止時的葉子序號。

Input

輸入第一行爲T,表示數據組數,對於每組數據僅一行,包含兩個整數D和I。其中2<=D<=20,1<=I<=524288

Output

對於每組數據輸出第I個小球下落停止時的葉子序號。

Sample Input

1
4 2

Sample Output

12
思路分析:本題是簡單的循環問題,關鍵在於數組要開大點。
代碼:#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int s[1100000];
int main()
{
    int t,d,n,i,k,max1,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&d,&n);
        memset(s,0,sizeof(s));
        for(i=1;i<=n;i++)//爲小球的總數        
        {
            k=1;
            for(j=1;j<d;j++)//爲層數啊
            {
                s[k]=s[k]^1;//取異或。
                if(s[k]%2==1) k=k*2;//判斷是否走左邊還是右邊。
                    else k=k*2+1;
            }
            if(i==n) max1=k;
        }
        printf("%d\n",max1);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章