题目来源:第十五届蓝桥杯大赛软件赛省赛Java 大学 B 组(算法题)
可以参考一下,本人也是比较菜
不喜勿喷,求求求
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取小伙伴的数量int n = scanner.nextInt();long[] a = new long[n];long min = Long.MAX_VALUE;// 读取每个小伙伴的能量晶石数量,并找出最小值for (int i = 0; i < n; i++) {a[i] = scanner.nextLong();if (a[i] < min) {min = a[i];}}long moves = 0;// 计算每个小伙伴与最小值的差值,并累加for (int i = 0; i < n; i++) {moves += a[i] - min;}System.out.println(moves);scanner.close();}}
解题思路:
为了使所有小伙伴的能量晶石数量相同,我们可以通过数学推导发现,最终的操作次数可以通过计算每个小伙伴的能量晶石数量与一个固定值的差值的绝对值之和来得到。
我们可以先找到初始能量晶石数量最少的小伙伴,以他为基准,让其他小伙伴去补充能量,这样可以保证操作次数最少。
复杂度分析
-
时间复杂度:O(n),其中 n 是小伙伴的数量。主要时间开销在于读取输入和遍历数组计算差值。
-
空间复杂度:O(n),主要用于存储每个小伙伴的能量晶石数量。
有更好的方法欢迎留言和交流