C
赛时想的思路是正确的,是一个贪心的题目,应该先不断的让右边的老鼠入队。赛时的代码:
不清楚 如何模拟 毛移动和老鼠移动的过程。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0) {
int n = sc.nextInt();
int m = sc.nextInt();
int a[] = new int[m];
for (int i = 0; i < m; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
int count = 0;
int catIndex = 0;
for (int i = m - 1; i >= 0; i--) {
if (catIndex >= a[i]) {
continue;
}
count++;
catIndex += n-a[i]; //移动毛的距离 等于老鼠移动的距离
}
System.out.println(count);
}
}
}
D
题目的意思是一个数组,每个位置都可以进行若干次操作,减去一个数字K,最后所有的数字都是相等的,求这个k的最大值。因为最后需要相等,每两个数字之间相差应该都是 nk倍数的关系。
可以用一个数组记录下来所有数字之间差,然后求这些差的最大公约数就是结果k。
记录只差的时候 这个不要重复,可以用set集合来去重。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0) {
int n = sc.nextInt();
int a[] = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
if (a[n - 1] == a[0]) {
System.out.println(-1);
continue;
}
Set<Integer> set = new TreeSet<>();
for (int i = 0; i < a.length - 1; i++) {
if (a[i + 1] - a[i] != 0) {
int e = a[i + 1] - a[i];
set.add(e);
}
}
List<Integer> list = Arrays.asList(set.toArray(new Integer[0]));
int gcd = Math.abs(list.get(0));
// 迭代计算GCD
for (int i = 1; i < list.size(); i++) {
gcd = gcd(gcd, Math.abs(list.get(i)));
}
System.out.println(gcd);
}
}
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
}
不提wa了,原因是没有判断是否想的情况,如果所有的元素都是一样的,那么k可以任意大,输出-1.