贝壳2019机试题

1.家族关系   

      并差集:https://blog.youkuaiyun.com/xu1105775448/article/details/82077944 

/**
 * 功能描述: <br>
 * 时间限制:C/C++语言1000MS;其他语言3000MS
 * 内存限制:CC++语言65536KB;其他语言589824KB
 *
 * 题目描述:
 * 小明和小红是亲兄妹,他俩起翻了翻他们家的族谐,发现他们家非常庞大,有非常多的名字在族谐里面。族谱中会写消楚每一个人的父亲是谁,当然每个人都只会有一个父亲。
 * 对于祖先的定义,我们在这儿个例子:族里面会写小王的父亲是小丁,小丁的父亲是小东,那么实际上小东就是小王的爷爷,也是小王的祖先
 * 小明很聪明,小明理了理他们的家庭关系,很快就青清楚了,知道了族谐中每一个人的祖先关系。
 * 但是小红却依旧困感,于是问了很多问题,希望你能够解答。
 * 小红的问题是,请问A是B的祖先关系是什么?究竞A是不是B的祖先,或者说B
 * 是A的祖先,亦或者B和A不存在祖先关系呢
 * 输入
 * 第一行包括一个整数n表示家族成员个数
 * 接下来n行每行对整数对a和b表示a是b的父亲,或者b是a的父亲,这需要你
 * 来判断
 * 如果b是-1,那么就是整个家族的根,也就是举分最大的人,保证只有一个。
 * 第n+2行是一个整数m表示小红的询问个数
 * 接下来m行,每行两个正整数A和B
 * 表示小红想知道A是8的祖先关系
 * n,ms4000,每个节点的编号都不超过40000
 * 输出
 * 对于每一个询问
 * 1表示A是B的祖先,输出2表示B是A的祖先,都不是输出0
 * 样例输入
 * 10
 * 1 -1
 * 3 1
 * 4 1
 * 5 1
 * 6 1
 * 7 1
 * 8 1
 * 9 1
 * 10 1
 * 2 10
 * 2 3
 * 2 4
 * 2 5
 * 2 10
 * 样例输出
 * 1
 * 0
 * 0
 * 0
 * 2
 * @Author: 万少波
 * @Date: 2019/8/10 13:57
 */
public class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入家庭关系的个数:");
        int readTime = scanner.nextInt();
        System.out.println("请依次输入"+readTime+"个成员以及其父亲:");
        if(readTime <= 0){
            System.exit(0);
        }
        int[] v = new int[readTime+1];
        while(readTime > 0) {
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            v[a] = b;
            readTime--;
        }
        int m ;//询问个数
        System.out.println("请输入询问的个数:");
        List<Integer> result = new ArrayList<Integer>();
        m = scanner.nextInt();
        for(int i =0;i<m ; i++){
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            int res = isParent(v,a,b);
            result.add(res);
        }
        for(Integer res: result){
            System.out.println(res);
        }
    }

    private static int isParent(int[] v, int a, int b) {
        if(v[a] == -1){
            //a 是根结点
            return 1;
        }else if(v[b] == -1){
            //b是根节点
            return 2;
        }else{
            int cur = v[a];
            while(cur != -1){
                if(cur == b){
                    return 2;
                }
                cur = v[cur];
            }
            cur = v[b];
            while(cur != -1){
                if(cur == a){
                    return 1;
                }
                cur = v[cur];
            }
            return 0;
        }
    }
}

2.计算器  

  假设有这样一个计算器,该计算器只有两个按钮,按下第一个按钮能使显示数值减少1,按下第二个按钮能使显示数值乘以2,当前显示数值为N, 那么至少要按多少次按钮才能显示数值编程M?

输入:输入两个整数N和M,1≤N,M≤109。
输出:是显示数值变成M的最少按钮次数。

样例输入:
4 5
样例输出:
3
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值