1. 程式人生 > >Dropping Balls UVA - 679(二叉樹的遍歷)

Dropping Balls UVA - 679(二叉樹的遍歷)

題目 net ima 二叉樹的遍歷 int problem 小球 spa bre

題目鏈接:https://vjudge.net/problem/UVA-679

技術分享圖片

技術分享圖片

題目大意:t組樣例,每組包括D M 層數是D 問第M個小球落在哪個葉子節點? 每個節點有開關 剛開始全都是關閉的,小球走到節點 節點開關變為與當前相反 每個小球從根節點釋放

思路:這題是第一道二叉樹遍歷的題目,二叉樹暴力模擬的確可以求出答案 ,但是很不幸,會超時

然後另一種方法,只需要求第M次小球就行了! 怎麽求呢? 試想一下,如果M為奇數 那麽從根節點開始看,肯定是往左走(M+1)/2次 往右走M/2次 但是最後一次肯定是往左走的

同理,如果M是偶數 顯然 往左走M/2次 往右走 M/2次 顯然最後一次是往右走的 這就是做這題的思想了 然後往復此過程 !

看代碼:

#include<iostream>
using namespace std;
int main()
{
    int t;
    int n,m;
    while(cin>>t)
    {
        if(t==-1) break;
        while(t--)
        {
            int ans=1;
            cin>>n>>m;
            for(int i=1;i<n;i++)//
            {
                if
(m%2==1) //最後一次肯定往左子樹走 且走的次數為(m+1)/2 { m=(m+1)/2; ans=ans<<1; } else//往右子樹走 { m=m/2; ans=ans<<1|1; } } cout<<ans<<endl; } }
return 0; }

Dropping Balls UVA - 679(二叉樹的遍歷)