百度3.29 实习笔试

第一题

度度熊请你找出两个数a,b,满足1<=a,b<=n且
lcm(a,b)-gcd(a,b)尽量大,输出最大的lcm(a,b)-gcd(a,b),
其中lcm(a,b)表示a b 最小公倍数,gcd(a,b)表示最大公约数
输入:
一行一个数字n(2<=n<=10^9)
输出:
一个数表示最大值

solution

由于n和n-1一定互质,所以直接返回 n*(n-1) -1
注意用long保存答案,使用int,乘法运算会溢出


import java.util.Scanner;
 
public class Solution1 
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        long n=s.nextLong();
        System.out.print((n-1)*n-1);
    }
}

第二题

老板给度度熊n个数,每一次从a【i】中取出一个最大的数减去n,其他n-1个数加上1,一直重复直到最大的a[ i ]<n,执行次数为k,老板想知道最少要执行多少次操作才能使n个数都小于n?

solution

模拟法,每次选取最大的一项的值为max;更新最大项max=max%N; 其余每项加上 max/N;
一直循环到满足题目要求,数组每项都小于N


import java.util.Scanner;
public class Solution2 {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
 
        int N = s.nextInt();
        long[] nums=new long[N];
        long sum=0;
        for (int i = 0; i < N; i++) {
            nums[i]=s.nextLong();
 
        }
        while(!isValid(nums)){
            long max=0;
            int index=0;
            for (int i = 0; i < nums.length; i++) {
                if(max<nums[i]){
                    max=nums[i];
                    index=i;
                }
            }
            sum+=max/N;
            for (int i = 0; i <N ; i++) {
                nums[i]+=max/N;
            }
            nums[index]=max%N;
        }
        System.out.println(sum);
    }
    public static boolean isValid(long[] nums){
        boolean res=true;
        for(long l:nums){
            if(l>=nums.length){
                res=false;
            }
        }
        return res;
    }
}

第三题

当做图模型来解题,求图中权值递增的最长路径;根据题意,图中只有N-1条边,且无法从权值大的点走到权值小的点,因此遍历图的时候,并不会出现“往回走”,“死循环”的问题
所以这里可以直接用深度优先遍历


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class Solution3 {
    static int max=0;
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        int N=s.nextInt();
        int[] nums=new int[N+1];
        for (int i = 1; i < N+1; i++) {
            nums[i]=s.nextInt();
        }
        List<Integer>[] graph=new ArrayList[N+1];
        for(int i=0;i<graph.length;i++){
            graph[i]=new ArrayList<>();
        }
        for (int i = 0; i <N-1 ; i++) {
            int l=s.nextInt();
            int r=s.nextInt();
            graph[l].add(r);
            graph[r].add(l);
        }
        for (int i = 1; i <N ; i++) {
            dfs(graph,nums,i,0);
        }
        System.out.println(max);
 
    }
    public static void dfs(List<Integer>[] graph,int[] nums,int now,int len){
        len+=1;
        max=Math.max(max,len);
        List<Integer> nexts=graph[now];
        for (int next:nexts ) {
            if(nums[next]>nums[now]){
                dfs(graph,nums,next,len);
            }
        }
    }
}
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值