LRJ入門經(jīng)典(基礎篇)——6.小球下落

6.小球下落

問題描述:
有一棵二叉樹,最大深度為D,且所有的葉子深度都相同。所有結點從上到下從左到右編號為1,2,3,…,2eD-1。在結點1處放一個小球,它會往下落。每個結點上都有一個開關,初始全部關閉,當每次有小球落到一個開關上時,它的狀態(tài)都會改變。當小球到達一個內(nèi)結點時,如果該結點的開關關閉,則往上走,否則往下走,直到走到葉子結點,如下圖所示。
一些小球從結點1處依次開始下落,最后一個小球?qū)涞侥睦锬兀枯斎肴~子深度D和小球個數(shù)I,輸出第I個小球最后所在的葉子編號。假設I不超過整棵樹的葉子數(shù);D<=20。輸出最多包含1000組數(shù)據(jù)。


樣例輸入:
4 2
3 4
10 1
2 2
8 128
16 12345
樣例輸出:
12
7
512
3
255
36358
分析:二叉樹性質(zhì)的簡單應用

//輸入深度和小球個數(shù)
//確定最大的小球編號、確定葉子起始節(jié)點編號
//重起始節(jié)點開始當前節(jié)點為(n):如果為0則下一個節(jié)點為男2n,否者為2n+1;束條件為:n> 最大葉子節(jié)點。
#include <cstdio>
#include <cstring>
const int maxd = 20;
int s[1<<maxd];
int main() {
    int d, t;
    while(scanf("%d %d",&d,&t) == 2){
        memset(s, 0, sizeof(s));//用于某一塊內(nèi)存的初始化
        int max_leaf_node = (1<<d)-1;// 確定最大葉子編號;
        int k;
        for(int i = 0;i < t;i++){
            k=1;
            for(;;){
                if(s[k] == 0) {
                    s[k] = 1;
                    k = k*2;
                }
                if(s[k] == 1){
                    s[k] = 0;
                    k = k*2 + 1;
                }
                if(k>max_leaf_node) break;
            }
        }

        printf("%d\n",k/2);
    }
    return 0;
}

測試數(shù)據(jù)

4 2
12
3 4
7
10 1
512
2 2
3
8 128
255
16 12345
36358
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 80末班車,90早班車的娃。不知不覺的,你已經(jīng)在奔三的路上了。工作還是如此的不安分,情感居然還是單身,人生...
    為活著而活著_傻夢閱讀 282評論 0 2
  • 你佇立在許墨腦神經(jīng)專家室的門口,凝視著門上已經(jīng)標記“外出”已久的銘牌,大概有多久時間沒有見到過許墨了呢?他會...
    劉小萌斯基閱讀 239評論 0 0
  • 少女心滿滿的天使之翼,可愛優(yōu)雅的天使翅膀造型通體925純銀采用微鑲滿鉆5a級鋯石,送給最可愛的姑娘,帶你翱翔天空,...
    喵小圈閱讀 2,849評論 0 0
  • 感恩祖國日新月異的發(fā)展,現(xiàn)在出門越來越便捷,感謝高鐵的快捷,讓出行更方便! 感恩一位素不相識的帥哥,主動給我調(diào)換座...
    那朵花蕾閱讀 212評論 0 0
  • 諾斯清生理性海水
    葉散天閱讀 124評論 0 0