http://ac.jobdu.com/problem.php?pid=1011

来源:互联网 发布:查士丁尼瘟疫 知乎 编辑:程序博客网 时间:2024/05/01 18:51
题目描述:
    给定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 -210-10 1 2 3 4 -5 -23 3 7 -2165 -8 3 2 5 01103-1 -5 -23-1 0 -20
样例输出:
20 11 1310 1 410 3 510 10 100 -1 -20 0 0
[cpp] view plaincopy
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<memory.h>  
  4. #include<cstdlib>  
  5. using namespace std;  
  6. #define MAX 0XFFFFFFF;  
  7. int a[10001];  
  8.   
  9. int main(){  
  10.     //freopen("in.txt", "r", stdin);  
  11.     int n;  
  12.     while(cin>>n, n){  
  13.         bool flag = false;  
  14.         for(int i=0;i<n;++i){  
  15.             scanf("%d", a+i);  
  16.             if(a[i]>=0)  
  17.                 flag = true;  
  18.         }  
  19.   
  20.         if(!flag){  
  21.             printf("%d %d %d\n", 0, a[0], a[n-1]);  
  22.         }else{  
  23.             int max = -MAX;  
  24.             int sum = 0;  
  25.             int s=0, start=0, end;  
  26.             for(int i=0;i<n;++i){  
  27.                 sum += a[i];  
  28.                 if(sum>max){  
  29.                     max = sum;  
  30.                     start = s;  
  31.                     end = i;  
  32.                 }  
  33.                 if(sum<0){  
  34.                     sum = 0;  
  35.                     s = i+1;  
  36.                 }  
  37.             }  
  38.             printf("%d %d %d\n", max, a[start], a[end]);  
  39.   
  40.         }  
  41.   
  42.   
  43.     }  
  44.     //fclose(stdin);  
  45.     return 0;  
  46. }  
原创粉丝点击