UVALive 7363 A Rational Sequence (二叉树)

来源:互联网 发布:钱刷宝提示网络异常 编辑:程序博客网 时间:2024/06/06 07:03

大体题意:

二叉树每一个点的权值都是一个分数形式,根节点是1/1,(p/q)左儿子是p/(p+q),右儿子是(p+q)/q.每个点的编号按照层序遍历依次给出,然后告诉你个分数,求得这个分数结点的编号!

思路:

直接模拟即可!当p!=q 就一直循环,然后分四种情况讨论,差值和p的大小关系!

模拟时记录一下路径,在从根节点回来算一下编号即可!

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<vector>#include<set>#include<map>#include<stack>#include<cctype>#include<string>#include<iostream>#include<queue>#define fout freopen("out.txt","w","stdout");#define mr make_pair#define fi first#define se secondusing namespace std;typedef long long ll;typedef unsigned long long LLU;const int maxn = 1000 + 5;const int mod = 1000000000;const double eps = 1e-8;const int inf = 0x3f3f3f3f;vector<char>cmd;int main(){    int T;    scanf("%d",&T);    while(T--){        cmd.clear();        ll k;        scanf("%lld",&k);        ll p,q;        scanf("%lld/%lld",&p,&q);        ll ans = 1;        while(p != q){            ll Max = max(p,q);            ll Min = min(p,q);            ll cha = Max - Min;            if (p == Min && p <= cha)cmd.push_back('R'),p = p,q = cha;            else if (p == Max && q >= cha)cmd.push_back('L'),p = cha,q = q;            else if (p == Min && p >= cha)cmd.push_back('R'),p = p,q = cha;            else if (p == Max && q <= cha)cmd.push_back('L'),p = cha,q = q;            else p = 1,q=1;        }        int len = (int)cmd.size();        for (int i = len-1; i>=0; --i){            if (cmd[i] == 'R')ans *=2;            else ans = ans*2+1;        }        printf("%lld %lld\n",k,ans);    }    return 0;}


0 0
原创粉丝点击