CSU 1711 Kinfolk【模拟】

来源:互联网 发布:ctp交易接口源码 编辑:程序博客网 时间:2024/05/27 10:43

题目链接

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1711

思路

题意有点复杂,不好说,看原题吧。

就是找到两点层数差距p,和他们的公共祖先离他们层数较小的点的差距q,然后分类讨论。
c是层数较大的那个点的相应的和另一个点同层的父辈。

AC代码

#include <iostream>#include <algorithm>#include <string>#include <cmath>#include <cstring>#include <cstdio>#include <map>#include <cstring>using namespace std;int level(int a){    int w=1;    for(int i=0 ; i<32 ; ++i)    {        int ww=w<<i;        if(ww>a)        {            return i;        }    }    return -1;}bool is_same_level(int a, int b){    if(level(a)==level(b))return 1;    else return 0;}int get_removal(int a, int b)//b>a{    int cnt=0;    while(1)    {        if(is_same_level(a,b))return cnt;        cnt++;        b/=2;    }    return -1;}int get_removal_cousin(int a, int b)//b>a{    int cnt=0;    while(1)    {        if(is_same_level(a,b))return b;        cnt++;        b/=2;    }    return -1;}int get_cousin(int a, int b)//level(a)==level(b){    int cnt=0;    while(1)    {        if(a==b)return cnt;        cnt++;        a/=2;        b/=2;    }    return -1;}int main(){    int a,b;    char sex;    while(cin>>a>>b>>sex,a!=-1)    {        a++;b++;        if(a==b)        {            printf("self\n");            continue;        }        bool flag=0;//has reversed        if(b<a)        {            flag=1;            swap(a,b);        }        int p=get_removal(a,b);        int c=get_removal_cousin(a,b);        int q=get_cousin(a,c);        if(c==a)//直系        {            if(p>4)printf("kin");            else            {                if(p>2)                {                    for(int i=0 ; i<p-2 ; ++i)                        printf("great-");                }                if(p>=2)                {                    printf("grand");                }                if(flag==0)                {                    if(sex=='M')                        printf("son");                    else                        printf("daughter");                }                else                {                    if(sex=='M')                        printf("father");                    else                        printf("mother");                }            }        }        else        {            if(q==1)//直系            {                if(p==0)                {                    if(sex=='M')                        printf("brother");                    else                        printf("sister");                }                else if(p>4)printf("kin");                else                {                    if(p>2)                    {                        for(int i=0 ; i<p-2 ; ++i)                            printf("great-");                    }                    if(p>=2)                    {                        printf("grand");                    }                    if(flag==0)                    {                        if(sex=='M')                            printf("nephew");                        else                            printf("niece");                    }                    else                    {                        if(sex=='M')                            printf("uncle");                        else                            printf("aunt");                    }                }            }            else            {                if(q>=5 || p>=4)printf("kin");                else                {                    if(q==2)printf("1st cousin");                    if(q==3)printf("2nd cousin");                    if(q==4)printf("3rd cousin");                    if(p!=0)printf(" ");                    if(p==1)printf("once removed");                    if(p==2)printf("twice removed");                    if(p==3)printf("thrice removed");                }            }        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击