百度算法题回忆
百度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/12590097.html