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;
}


posted on 2013-08-03 20:09  Primo...  阅读(155)  评论(0编辑  收藏  举报