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;
}
浙公网安备 33010602011771号