首先说下结果,自测结果通过,但提交结果运行超时,case通过率14.29%。说明思路基本正确,但是代码需要改进,代码的时间复杂度O(N^2)。
刚看时不懂题在说什么,后面看大家的讨论有点懂问题是什么。用自己的话说下,输入是这样:
8 5 6 5 6 7 6 6 3 1第一个元素8是后面数据长度。第二个元素5是要求最后的数据长度。第三个以及之后的组成需要处理的数据。也就是
6 5 6 7 6 6 3 1
是数据。共8个元素,要把这8个元素变为5个,但是总和不能变,每次个数-1时,合并相邻元素之和最小的数。也就是当8个元素变成7个时,相邻元素和最小的是最后的2个,这组数据中3与1相加为4最小,加入数据中,而之前的3,1删掉了,最后会成为下面的数据:
6 5 6 7 6 6 4之后的就是6和4:
6 5 6 7 6 10之后6和5:
11 6 7 6 10此时数据元素为要求的5个,所以处理结束。要求的结果就是这组数据中最大的那个。那就是11。返回11就是结果了。
Java的实现代码如下
import java.util.ArrayList; import java.util.Scanner; class Solution { public int getMinStep(int n, int m, ArrayList<Integer> arr) { int minIndex1 = 0; int minIndex2 = 1; int minSum; while (arr.size() != m) { minSum = Integer.MAX_VALUE; for (int i = 0, j = i + 1; i < arr.size() - 1 && j < arr.size(); i++, j++) { if (minSum > arr.get(i) + arr.get(j)) { minSum = arr.get(i) + arr.get(j); minIndex1 = i; minIndex2 = j; } } arr.set(minIndex1, minSum); arr.remove(minIndex2); /*for (int i = 0; i < arr.size(); i++) { System.out.print(arr.get(i) + " "); } System.out.println(minSum+"_");*/ } int result = this.getMaxInt(arr, n); return result; } public int getMaxInt(ArrayList<Integer> arr, int n) { int result = arr.get(0); for (int i = 0; i < arr.size(); i++) { if (result < arr.get(i)) { result = arr.get(i); } } return result; } } public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); ArrayList<Integer> arr = new ArrayList<>(); for (int i = 0; i < n; i++) { arr.add(sc.nextInt()); } /*for (int i = 0; i < n; i++) { System.out.println(arr[i]); }*/ //完成初始数据采集 Solution solution = new Solution(); int result = solution.getMinStep(n, m, arr); System.out.println(result); } }