来来来,看看这个又臭又长的代码,以后不会有了~
- 不要被标签动态规划误导了,我这里就没有动态规划;而且即使把问题一般化,也不用动态规划,而直接把这个长长的代码继续加长罢了。
- 开玩笑,如果一般化,咱把代码也一般化,比如再嵌套一次数组,或者使用递归的形式。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String[] numStrArr = in.nextLine().split(" ");
int[] data = new int[n];
int[] preSum = new int[n];
for (int i = 0; i < data.length; i++) {
data[i] = Integer.parseInt(numStrArr[i]);
if (i == 0) {
preSum[i] = data[i];
} else {
preSum[i] = preSum[i - 1] + data[i];
}
}
int total = preSum[preSum.length - 1];
if (total % 3 != 0) {
System.out.println(0);
return;
}
int count = 0;
int three = total / 3;
boolean find1 = false;
for (int i = 0; i < data.length - 2; i++) {
int j = i;
if (!find1) {
while (j < data.length && data[j] <= 0) {
j++;
}
if (j < data.length) {
find1 = true;
} else {
break;
}
}
while (j < data.length && preSum[j] != three) {
j++;
}
if (j >= data.length) {
break;
}
i = j;
boolean find2 = false;
for (int k = i + 1; k < data.length; k++) {
//第二次分割
j = k;
if (!find2) {
while (j < data.length && data[j] <= 0) {
j++;
}
if (j < data.length) {
find2 = true;
} else {
break;
}
}
while (j < data.length && preSum[j] != 2 * three) {
j++;
}
if (j >= data.length) {
// 没找到第二段的1/3
break;
}
k = j;
for (int l = k + 1; l < data.length; l++) {
// 第三段了,不用检查第三段的和是否等于1/3了,因为一定的
if (data[l] > 0) {
count++; // 终于可以计数了,重要找到一个分割了~
break;
}
}
//
}
}
System.out.println(count);
}
}

京公网安备 11010502036488号