第一行输入一个整数
代表数组中的元素数量。
第二行输入
个整数
代表数组中的元素。
如果无法使得数组
中的每个数都相同,则直接输出
;否则,输出一个整数,代表至少需要执行的轮数。
6 0 1 2 3 4 5
1
在这个样例中,第一轮数组的
为
,所以:
对于第一个元素
,使用
替换;
对于第二个元素
,使用
替换;
对于第三个元素
,使用
替换;
对于第四个元素
,使用
替换;
对于第五个元素
,使用
替换;
对于第六个元素
,使用
替换。
得到数组
,满足题干条件。所以,至少需要执行
轮操作。
5 3 1 2 4 5
-1
在这个样例中,由于第一轮数组的
为
,所以无论执行多少次操作,数组都不会改变,所以无法使所有数变为相同值。
6 0 1 3 4 7 9
5
在这个样例中:
第一轮操作:
,操作完后数组变为
;
第二轮操作:
,操作完后数组变为
;
第三轮操作:
,操作完后数组变为
;
第四轮操作:
,操作完后数组变为
;
第五轮操作:
,操作完后数组变为
。
综上所述,至少需要执行
轮操作。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
long[] a = new long[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextLong();
}
System.out.println(minOperations(a, n));
scanner.close();
}
private static Long minOperations(long[] a, int n) {
// 情况1:如果数组中所有元素已经相同,返回0
if (allElementsSame(a, n)) {
return 0L;
}
// 检查数组中是否包含0
boolean hasZero = false;
for (long num : a) {
if (num == 0) {
hasZero = true;
break;
}
}
// 情况2:如果数组元素不相同且不包含0,则不可能完成,返回-1
if (!hasZero) {
return -1L;
}
// 收集所有正整数并去重
Set<Long> positiveNumbers = new HashSet<>();
for (long num : a) {
if (num > 0) {
positiveNumbers.add(num);
}
}
// 将去重后的正整数转换为列表并排序
List<Long> positives = new ArrayList<>(positiveNumbers);
Collections.sort(positives);
// 正整数的个数使用int类型
int m = positiveNumbers.size();
// 最大的正整数
long maxP = positives.get(m - 1);
// 应用公式计算结果:maxP - (m - 1)
return maxP - (m - 1);
}
// 检查数组是否所有元素都相同
private static boolean allElementsSame(long[] a, int n) {
if (n <= 1) {
return true; // 空数组或只有1个元素,自然所有元素相同
}
long first = a[0]; // 以第一个元素为基准
for (int i = 1; i < n; i++) {
if (a[i] != first) { // 只要有一个元素与基准不同,就返回false
return false;
}
}
return true; // 所有元素都与基准相同,返回true
}
}