最大连续子序列

题目描述:
    给定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( K< 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。

输出:

    对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。

样例输入:
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
样例输出:
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cmath>
  5 #include <cctype>
  6 #include <cstring>
  7 
  8 #include <vector>
  9 #include <deque>
 10 #include <list>
 11 #include <map>
 12 #include <set>
 13 #include <stack>
 14 #include <queue>
 15 #include <algorithm>
 16 #include <string>
 17 
 18 
 19 #define MAXD 99999999
 20 using namespace std;
 21 
 22 
 23 int a[10000];
 24 
 25 int f[10000];
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 int main()
 36 {
 37 
 38 
 39     int n;
 40     int i,j,k;
 41 
 42     while(scanf("%d",&n)!=EOF)
 43     {
 44         if(n==0)
 45             break;
 46 
 47 
 48         for(i=0;i<n;i++)
 49         {
 50             scanf("%d",&a[i]);
 51         }
 52 
 53 
 54         f[0]=a[0];
 55 
 56         int s,t;
 57 
 58         int b;
 59 
 60         j=0;
 61         k=0;
 62         s=t=0;
 63 
 64         b=a[0];
 65 
 66         for(i=1;i<n;i++)
 67         {
 68 
 69             if(f[i-1]>=0)
 70             {
 71                 f[i]=f[i-1]+a[i];
 72                 k++;
 73 
 74                 if(f[i]>b)
 75                 {
 76                     s=j;t=k;
 77 
 78                     b=f[i];
 79                 }
 80             }
 81             else
 82             {
 83                 f[i]=a[i];
 84 
 85                 j=k=i;
 86 
 87                 if(f[i]>b)
 88                 {
 89                     s=j;
 90                     t=k;
 91                     b=f[i];
 92                 }
 93             }
 94         }
 95 
 96 
 97         if(b>=0)
 98         {
 99             cout<<b<<' '<<a[s]<<' '<<a[t]<<endl;
100         }
101         else
102         {
103             cout<<0<<' '<<a[0]<<' '<<a[n-1]<<endl;
104         }
105     }
106 
107 
108 
109         
110 
111 
112 
113 
114     return 0;
115 }

 

posted @ 2012-05-30 20:13  cseriscser  阅读(173)  评论(0编辑  收藏  举报