hduoj1231 注意和1003的区别

来源:互联网 发布:dz seo 编辑:程序博客网 时间:2024/06/06 15:44

注意最后一个样例:并不是全为负数,所以输出应该是子序列的起始终止值!

最大连续子序列

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 29013    Accepted Submission(s): 13139
Problem Description
给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20。 在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该 子序列的第一个和最后一个元素。
 
Input
测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
 
Output
对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元 素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
 
Sample Input
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
 

Sample Output
20 11 1310 1 410 3 510 10 100 -1 -20 0 0
代码:
#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

int  pri[100010];

int main(){

  int n, m, t, cnt = 1;
    
 while(cin >> n&&n)
  {
     int ans = 0,st,end,x,y,sum,cnt = 0;
     
         for(int i = 1;i <= n;i++) {
             cin >> pri[i];
    if(pri[i] >= 0)
    cnt = 1;
    }
    if(cnt == 0)
    {
     printf("0 %d %d\n",pri[1],pri[n]);
     continue;
    }
    else
    {
     ans = sum = st = end = x = y = pri[1];
     for(int i = 2;i <= n;i++)
     {
      if(sum > 0)//因为等于0的时候要找到最小的i和j
      {
       sum += pri[i];
       end = pri[i];
      }
      else if(sum <= 0)
      {
       sum = pri[i];
       st = pri[i];
       end = pri[i];
      }
      if(sum > ans)
      {
       ans = sum;
       x = st;
       y = end;
      }
     }
    }
    if(ans >= 0)
    printf("%d %d %d\n",ans,x,y);
    /*else
    printf("0 %d %d\n",pri[1],pri[n]);*/
  }
   return 0;

}
0 0
原创粉丝点击