A题
题意:给你一个数组,要求将数组中的元素构造成a,b两个数组,数组长度均大于等于1,且数组a中不存在元素a[i]能够整除b数组中的任意元素。
很简单的一道题目,把最大(可能有重复元素)的那个元素放进b数组即可。
private static void problemA(Fast fast) {
int t = fast.nextInt();
while(--t >= 0) {
int n = fast.nextInt();
var arr = new Integer[n];
for (int i = 0; i < n; i++) {
arr[i] = fast.nextInt();
}
Arrays.sort(arr);
if (n == 1 || Objects.equals(arr[0], arr[n - 1])) {
fast.write(-1 + "\n");
continue;
}
n--;
var list1 = new ArrayList<Integer>();
var list2 = new ArrayList<Integer>();
for (int i = 0; i <= n; i++) {
if (!Objects.equals(arr[i], arr[n])) {
list1.add(arr[i]);
} else {
list2.add(arr[i]);
}
}
fast.write(list1.size() + " " + list2.size() + '\n');
for (var num : list1) {
fast.write(num + " ");
}
fast.write("\n");
for (var num : list2) {
fast.write(num + " ");
}
fast.write("\n");
}
fast.flush();
}
B题
题意:多个数组,每一个数组都能拿出其中一个元素放到其他数组中去(也可以选择不拿),问操作执行完毕之后,每个数组的最小值之和的最大值为多少。
思路:我们可以先想到将所有数组的最小元素都拿走,那么结果是累加上各个数组第二小的元素和,但是现在所有拿出来的元素都必须放到某一个数组中去,那么我们应该把所有拿出来的最小元素都放到第二个元素最小的数组中去,这样才能达到最优解。
private static void problemB(Fast fast) {
int t = fast.nextInt();
while(--t >= 0) {
int n = fast.nextInt();
int min = Integer.MAX_VALUE;
int min1 = Integer.MAX_VALUE;
long sum = 0;
for (int i = 0; i < n; i++) {
int m = fast.nextInt();
var arr = new Integer[m];
for (int j = 0; j < m; j++) {
arr[j] = fast.nextInt();
}
Arrays.sort(arr);
sum += arr[1];
min = Math.min(arr[0], min);
min1 = Math.min(arr[1], min1);
}
sum += (min - min1);
fast.write(sum + "\n");
}
fast.flush();
}
C题
题意:1 - n的全排列数组,值为a[i] * i的和减去最大的max(a[i] * i),要求求出最大值。
思路:打表找规律,n等于10时,答案为1 2 3 4 5 6 7 10 9 8,判断答案可能是 1 2 3 … n n-1 n-2这种类型的,暴力枚举n即可。
private static void problemC(Fast fast) {
int t = fast.nextInt();
while(--t >= 0) {
int n = fast.nextInt();
int maxx = 0;
for (int i = 0; i <= n; i++) {
var list = new ArrayList<Integer>();
for (int j = 1; j <= i; j++) {
list.add(j);
}
for (int j = n; j > i; j--) {
list.add(j);
}
int sum = 0;
int max = 0;
for (int k = 0; k < n; k++) {
sum += list.get(k) * (k + 1);
max = Math.max(max, list.get(k) * (k + 1));
}
sum -= max;
maxx = Math.max(sum, maxx);
}
System.out.println(maxx);
}
}