首页 > 其他 > 详细

【实际笔试-回忆】

时间:2020-03-30 12:16:34      阅读:64      评论:0      收藏:0      [点我收藏+]

百度2020日常实习 - Java

@2020.3.29晚上:

(1)题目给出n,求所有(1<=a,b<=n)可能的a与b中:

计算(最小公倍数 - 最大公约数)的最大值:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n=sc.nextLong(); //这里的n用的是【long】,而不是int  //用int通过率30%
        long result=n*(n-1)-1;//【巧妙分析,不用一个个试】
        System.out.print(result);
    }
}

 

(2)给出n个数a[i],每次最大的减去n,其余+1,

直到a[i]中最大的数小于n为止,统计“减n”操作的次数:k

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        long[] a=new long[n+1];//因为a[i]属于1~10^18,所以用long,而不是int

        for(int i=0;i<n;i++){
            a[i]=sc.nextLong();//nextLong()
        }
        long k=0;
        while(true){
            long max=0;
            int index=0;
            for(int i=0;i<n;++i){
                if(max<a[i]){
                    max=a[i];
                    index=i;
                }
            }
            if(max<n)break;
            long temp=(a[index]-n)/n; //注意temp的类型
            if(temp<1)temp=1;
            a[index]=a[index]-n*temp;//【一次减去temp次的n,不然时间复杂度爆表】 //在这个修改之前,一直显示系统超时————“循环错误或者复杂度过高”
            for(int i=0;i<n;++i){
                if(i!=index)a[i]+=temp;//
            }
            k+=temp;
        }
        System.out.print(k);//【我们只需要次数k,不用完全模拟过程,要加速中间的步骤】
    }
}

 

【实际笔试-回忆】

原文:https://www.cnblogs.com/qyf2199/p/12597578.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!