題目來源:第十五屆藍橋杯大賽軟件賽省賽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),主要用于存儲每個小伙伴的能量晶石數量。
有更好的方法歡迎留言和交流