译文:
01-复杂度2 最大子序列和 (25分)
给定一个K个整数的序列{N 1, N 2,…, N K}。定义连续子序列为{N i, N i+1,…其中1≤i≤j≤K。最大子序列是指连续子序列中所有元素的和最大。例如给定序列{- 2,11,- 4,13,-5,-2},其最大子序列为{11,- 4,13},最大和为20。现在你需要找出最大和,以及最大子序列的第一个和最后一个数。
输入格式:
每个输入文件包含一个测试用例。每个案例占据两行。第一行包含一个正整数K(≤10000)。第二行包含K个数字,中间用一个空格隔开。
输出格式:
对于每个测试用例,在一行中输出最大和以及最大子序列的第一个和最后一个数字。数字之间必须有一个空格,但行尾不能有额外的空格。如果最大子序列不是唯一的,则输出索引i和j最小的子序列(如示例所示)。如果所有K个数都是负数,那么它的最大和被定义为0,你就应该输出整个序列的第一个和最后一个数。
输入样例:
10
-10 1 2 3 4 -5 -23 3 7 -21
输出样例:
10 1 4
直接上代码
#include <stdio.h>
int fun(int a[], int n);
int main()
{
int k;
scanf("%d", &k);
int a[k];
for (int i = 0; i < k; i++)
{
scanf("%d", &a[i]);
}
fun(a, k);
return 0;
}
int fun(int a[], int n)
{
int i, x = 0, y = 0, z = n - 1, count = 0, max = -1;
for (i = 0; i < n; i++)
{
count += a[i];
if (count > max)
{
max = count;
y = x;
z = i;
}
else if (count < 0)
{
count = 0;
x = i + 1;
}
}
if (max < 0)
printf("0 %d %d", a[0], a[i - 1]);
else
printf("%d %d %d", max, a[y], a[z]);
}