第一题
度度熊请你找出两个数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);
}
}
}
}