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