題目鏈接:
https://cn.vjudge.net/problem/UVA-679
題目大意:
有一個滿二叉樹,有深度d。除葉節點外每一節點有一開關,默認爲關。
有I個小球從根節點向下走,如果開關是關着的,就向左子樹走,否則向右子樹走。每走過一個節點,該節點的開關狀態轉變爲相反的狀態。現在問第I個小球最後落在編號爲多少的葉節點上。(編號爲層序編號)
大致思路
一開始覺得這個題是存在O(1)的解的,就是存在規律可以直接推出答案。但覺得太麻煩就還是用模擬去敲。然後發現純模擬的話是會超時的,所以還是要推規律,不過也不用推成O(1)的那種。
可以發現:當I爲奇數時,其走的路線和(I+1)/2的路線一樣,否則就是和I/2的路線一樣。這樣就這一直接模擬最後一次的情況。
代碼:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int main()
{
int t,d,num;
cin>>t;
while(t--)
{
cin>>d>>num;
if(d==-1)//題目描述的輸入很迷,反正加上就是了
break;
int n=(1<<d)-1,place=1;
for(int i=1;i<=d-1;++i){
if(num%2){
place*=2;
num=(num+1)/2;
}else{
place=place*2+1;
num/=2;
}
}
cout<<place<<endl;
}
return 0;
}