URAL - 1117 Hierarchy(找规律)
题意:
给定一个关系树,a和b之间传递信息,问需要经过多长时间,其中每个人只能想编号临近的人传递信息,有上下关系的两人传递信息不花时间。
思路;
这个题的题意很不好理解,我在比赛中只能看出这道题是找规律的题目,但是由于题意没有理解清楚,代码交上一直wa。。后来就放弃了。。。两个没有上下关系的人中间隔了几个人,就得花费几天的时间。这里的间隔是指沿树的路径走上去经过的人数。例如从7到8 就经过了6 4。
把草图画出,就可以看出其中的规律。
代码如下;
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <queue> #include <stack> #include <list> #include <vector> #include <map> #include <algorithm> #define LL long long #define LLU unsigned long long #define INF 0x7fffffff using namespace std; LL f(int x) { if(x<4) return 0; LL ans = 0; int i; for( i = 2; (1LL<<i) < x; ++i) ans = (ans<<1)+((i-2)<<1); if(x==(1LL<<i)) return (ans<<1)+((i-2)<<1)+i-1; if(x+1==(1LL<<i)) return (ans<<1)+((i-2)<<1); return ans+((i-2)<<1)+f(x-(1LL<<(i-1))); } int main () { int a, b; scanf("%d%d",&a, &b); printf("%I64d\n", abs(f(a)-f(b))); return 0; }