问题描述
给定序列 a[1],a[2],a[3]......a[n],你的工作是计算子序列的最大和。例如,给定 (6,-1,5,4,-7),此序列中的最大和为 6 + (-1) + 5 + 4 = 14。
输入
输入的第一行包含一个整数 T(1<=T<=20),表示测试用例的数量。然后是 T 行,每行都以一个数字 N(1<=N<=100000) 开头,然后是 N 个整数(所有整数都在 -1000 到 1000 之间)。
输出
对于每个测试用例,您应该输出两行。第一行是 “Case #:”,# 表示测试用例的编号。第二行包含三个整数,即序列中的最大总和、子序列的起始位置、子序列的结束位置。如果有多个结果,则输出第一个结果。在两个事例之间输出一个空行。
示例输入
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
示例输出
Case 1:
14 1 4
Case 2:
7 1 6
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int a = 1;//第a个案例
while (T-- != 0) {
int n = sc.nextInt();//元素个数
int[] arr = new int[n];
int x = -1;
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
if (arr[i] > 0) x = 0;
}
if (x == -1) {
int[] arr1 = arr.clone();
Arrays.sort(arr);
System.out.println();
int m = 0;
for (int i = 0; i < n; i++) {
if (arr1[i] == arr[arr.length - 1]) {
m = i;
break;
}
}
System.out.println("Case " + a + ":");
System.out.println(arr[arr.length - 1] + " " + (m + 1) + " " + (m + 1));
if (T != 0) System.out.println();
a++;
continue;
}
int z = 0;
int y = 0;
int star = 0;
int max = -1;
int num = 0;
for (int i = 0; i < n; i++) {
num += arr[i];
if (num > max) {
max = num;
z = star;
y = i;
}
if (num < 0) {
star = i + 1;
num = 0;
}
}
System.out.println("Case " + a + ":");
System.out.println(max + " " + (z + 1) + " " + (y + 1));
if (T != 0) System.out.println();
a++;
}
}
}