UVA 679 Dropping Balls
思路:
因为小球落下后,开关的状态就会改变,所以一个节点上的小球的去向,跟这个小球是第几个到达此节点
有关系,也就是说,如果到达时是第奇数个,往左走,偶数个,就要往右走;
比如,如果是节点1,那么我们可以知道,第一个小球(I=1)肯定是往左走,第二个小球(I=2)则是往右走;
也就是球到达的编号为奇数,则往左走,偶数往右走;
那么如果是节点2呢,如果把节点2看成节点1,其实也有规律;
比如第5颗球,他是第五个到达节点1的球,接下来往左,第5/2+1=3(奇)个到达节点2的球,
接下来往左,3/2+1=2(偶),第2个到达节点4,下面第2/2=1个到达节点9;
说来说去就是,球到达每个节点的编号决定了它下一步的方向,于是,我们只需要模拟最后一颗球,
就可以得到结果。
还要注意,二叉树的结构是
所以节点编号计算是往左k*2,往右k*2+1。
1 #include<cstdio> 2 int main() { 3 int T, D, I; 4 scanf("%d", &T); 5 while (T--) 6 { 7 scanf("%d%d", &D, &I); 8 int k = 1;//k是当前节点的编号 9 for (int i = 0; i < D - 1; i++) 10 { 11 if (I % 2) //奇数,是往左走的,第(I + 1) / 2个小球 12 { 13 k = k * 2; 14 I = (I + 1) / 2; 15 } 16 else //偶数,往右,第I/2个 17 { 18 k = k * 2 + 1; 19 I /= 2; 20 } 21 } 22 printf("%d\n", k); 23 } 24 return 0; 25 }
分类:
OJ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步