CSU 1711 Kinfolk【模拟】
2016-04-17 17:34
281 查看
题目链接
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; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006