TZOJ:最大连续子序列

描述

给定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.

题目来源

HDOJ

菜鸡的成长史 ^-^

 

 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\n",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\n",maxx,a[u],a[v]);
36     }
37     return 0;
38 }
View Code

 

 

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/10599277.html