第一行输入一个整数
代表数组中的元素数量。
第二行输入
个整数
代表数组中的元素。
如果无法使得数组
中的每个数都相同,则直接输出
;否则,输出一个整数,代表至少需要执行的轮数。
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 } }