首先说下结果,自测结果通过,但提交结果运行超时,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);
}
} 
京公网安备 11010502036488号