描述
给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
输入
测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
输出
对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
样例输入
样例输出
提示
Huge input, scanf is recommended.
题目来源
菜鸡的成长史 ^-^
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n; 6 while(scanf("%d",&n)&&n!=0) 7 { 8 int jishu=0,geshu=0,a[10005]; 9 memset(a,0,sizeof(a)); 10 for(int i=1;i<=n;i++) 11 { 12 scanf("%d",&a[i]); 13 if(a[i]<0) geshu++; 14 } 15 if(geshu==n) //全都是负数 16 {printf("%d %d %d ",0,a[1],a[n]);continue;} //特判 17 int maxx=0,u=1000,v=1000; 18 for(int i=1;i<=n;i++) //全部都遍历一边 19 { 20 int num=0; 21 for(int j=i;j<=n;j++) 22 { 23 num+=a[j]; 24 if(num>=maxx) //能够找到就更新 25 { 26 if(num>maxx) maxx=num,u=i,v=j; 27 else 28 { 29 if(u+v>i+j) 30 u=i,v=j; 31 } 32 } 33 } 34 } 35 printf("%d %d %d ",maxx,a[u],a[v]); 36 } 37 return 0; 38 }