https://vjudge.net/problem/UVA-679
A number ofKballs are dropped one by one from the root of a fully binary tree structure FBT. Eachtime the ball being dropped first visits a non-terminal node. It then keeps moving down, either followsthe path of the left subtree, or follows the path of the right subtree, until it stops at one of the leafnodes of FBT. To determine a ball’s moving direction a flag is set up in every non-terminal node withtwo values, eitherfalseortrue. Initially, all of the flags arefalse. When visiting a non-terminal nodeif the flag’s current value at this node isfalse, then the ball will first switch this flag’s value, i.e., fromthefalseto thetrue, and then follow the left subtree of this node to keep moving down. Otherwise,it will also switch this flag’s value, i.e., from thetrueto thefalse, but will follow the right subtree ofthis node to keep moving down. Furthermore, all nodes of FBT are sequentially numbered, starting at1 with nodes on depth 1, and then those on depth 2, and so on. Nodes on any depth are numberedfrom left to right.
For example, Fig. 1 represents a fully binary tree of maximum depth 4 with the node numbers 1,2, 3, ..., 15. Since all of the flags are initially set to befalse, the first ball being dropped will switchflag’s values at node 1, node 2, and node 4 before it finally stops at position 8. The second ball beingdropped will switch flag’s values at node 1, node 3, and node 6, and stop at position 12. Obviously,the third ball being dropped will switch flag’s values at node 1, node 2, and node 5 before it stops atposition 10.
Fig. 1: An example of FBT with the maximum depth 4 and sequential node numbers.
Now consider a number of test cases where two values will be given for each test. The first value isD, the maximum depth of FBT, and the second one is I, theI-th ball being dropped. You may assumethe value ofIwill not exceed the total number of leaf nodes for the given FBT.
Please write a program to determine the stop positionPfor each test case.For each test cases the range of two parametersDandIis as below:
Input
Containsl+ 2lines.
2≤D≤20,and1≤I≤524288.
Line 1lthe number of test cases
Line 2 D1I1test case #1, two decimal numbers that are separated by one blank...
Line k+1DkIktest case #k
Linel+1DlIltest case #l
Linel+ 2-1a constant ‘-1’ representing the end of the input file
Output
Containsllines.
Line 1...Linek...Linel
the stop positionPfor the test case #1the stop positionPfor the test case #kthe stop position Pfor the test case #l
Sample Input
5
4 2
3 4
10 1
2 2
8 128
-1
Sample Output
12
7
512
3
255
思路:盲目模拟会超时,要分析小球的个数和小球移动方向的关系。当小球个数为奇数时,小球向左移动,偶数是向右移动。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
while(t--!=0){
int d = scan.nextInt();
if(d==-1)
break;
int i = scan.nextInt();
int k = 1;
for(int m = 0;m<d-1;m++){
if(i%2==1){
k = 2*k;
i = (i+1)/2;
}else{
k = 2*k+1;
i = i/2;
}
}
System.out.println(k);
}
}
}