題目敘述
每筆測資第一行有一個正整數N,接下來會有N行,每行有兩個正整數D和L,分別代表要跑幾層及有幾顆球。當球遇到非終端節點時,可能往左子樹跑,也可能往右子樹跑,如此直到這顆球到達終端節點(也就是樹葉)為止。至於在非終端節點時球該往左或往右的決定乃是由2個值 true, false 來控制的。如果這非終端節點的現在的值為 false,則球來的時候會往左子樹走,但是這個值會變為 true。如果這非終端節點的現在的值為 true,則球來的時候會往右子樹走,但是這個值會變為 false。一開始時所有非終端節點的值均為 false。要求輸出最後會跑到的節點位置。
範例輸入 #1
5
4 2
3 4
10 1
2 2
8 128
範例輸出 #1
12
7
512
3
255
解題思路
跑一個D的For迴圈,當L是偶數時就是往右走 (目前位置*2+1),然後L/=2。如果L是奇數的話就是往左走 (目前位置*2),然後L = L/2+1。輸出最後的位置即可。
解題程式碼如下 (僅供參考):
#include <iostream>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
for (int i = 0; i<N; i++)
{
int D, L;
cin >> D >> L;
int pos = 1;
for (int j = 0; j<D; j++)
{
if (L % 2 == 0)
{
L /= 2;
pos = (pos*2)+1;
}
else
{
L = (L/2)+1;
pos *= 2;
}
}
cout << pos/2 << "\n";
}
}
留言
張貼留言