UVA679 小球下落 Dropping Balls TJ

题目链接

思路

模拟,但是很明显 \(TLE\) ,一个数据都过不了。
我们发现这个小球掉落的次数有规律,而且跟奇偶有关。
图片1
\(1\) 次到 \(1\) 节点向左,第 \(2\) 次向右,第 \(3\) 次向左……
\(1\) 次到 \(3\) 节点向左,第 \(2\) 次向右,第 \(3\) 次向左……

那么我们开始找规律,初始为 \(i\)
到达 \(1\) 节点,很显然,如果 \(i\) 是奇数,那么向左。
如果向左,那么怎么算出来 \(i\) 是第几次到达 \(3\) 节点的呢?
最终发现,\(i\) 是第 \((i + 1) / 2\) 次到达该节点。以此类推,如果 \((i + 1) \times 2\) 是奇数还需要向左。
如果是偶数,以此类推。不过是第 \(i / 2\) 次到达下一个节点。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 20;
int d ,i ,n;
int main () {
	scanf ("%d",&n);
	for (int q = 1;q <= n;++ q) {
		scanf ("%d%d",&d ,&i);
		int k = 1;
		for (int q = 0;d --;++ q) {
			if (i & 1) {
				k <<= 1; i = (i + 1) >> 1;
			}
			else {
				k = k << 1 | 1; i >>= 1;
			}
		}
		printf ("%d\n",k / 2);
	}
	return 0;
}

posted @ 2020-10-30 20:43  tuscjaf  阅读(55)  评论(0编辑  收藏  举报