UVA679 小球下落 Dropping Balls TJ
思路
模拟,但是很明显 \(TLE\) ,一个数据都过不了。
我们发现这个小球掉落的次数有规律,而且跟奇偶有关。
第 \(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;
}
cb