浙江大学pat 1007

注意点:

1. 一道需要思考才会写的简单的题目。思想是这样的,有两个保存的序列,一个是历史最大序列用于保存最大结果,一个是当前最大序列用于保存到当前位置的最大序列。从0到n考虑是否要将某个数加入序列中,比如考虑第i位,由于要找的是一个连续的序列,所以考虑第i位是否是序列的一部分的时候,第i-1位肯定是已经被包括进序列了,所以对加上第i位后的值进行判断,如果是一个正数,说明这个序列可以继续增长,和当前记录的最大序列相比,更新最大序列;若果和是一个负数,说明这个序列已经没用了(到第i位的最大是一个负数,那么第i+1位加上一个负数肯定都会更小吧),所以当前序列要进行更新,从第i+1位重新开始。

2. 注意输出的是序列和以及开始位置结束位置的数值,不是对应的index,给的example刚好index和对应index的数值相同,容易误导导致错误。


代码如下:

#include <iostream>
#include <string.h>
#include <stack>
#include <math.h>
#include <vector>
#include <algorithm>
#define MAXNUM 0x3f3f3f3f
#define MAXLEN 10001
#define STARTTIME 8 * 60 * 60
#define ENDTIME 21 * 60 * 60
#define max(a, b) (((a) > (b)) ? (a) : (b))
using namespace std;
typedef struct SubSeq
{
  int s, e;
  int sum;
  SubSeq(): sum(0){};
};
int num[10001];
int main()
{
  int K;
  int i, j;
  int temp;
  SubSeq maxS, maxRS;
  scanf("%d", &K);
  for(i = 0; i < K; ++ i)
    scanf("%d", &num[i]);


  maxS.s = maxS.e = 0;
  maxS.sum = -1;
  maxRS.s = maxRS.e = 0;
  maxRS.sum = 0;
  for(i = 0; i < K; ++ i)
  {
    maxRS.sum += num[i];
    if(maxRS.sum < 0)
    {
      maxRS.s = i + 1;
      maxRS.sum = 0;
      continue;
    }
    if(maxRS.sum > maxS.sum)
    {
      maxS = maxRS;
      maxS.e = i;
    }
  }
  if(maxS.sum < 0)
    printf("0 %d %d", num[0], num[K - 1]);
  else
    printf("%d %d %d", maxS.sum, num[maxS.s], num[maxS.e]);
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值