01-复杂度2 Maximum Subsequence Sum

输出要求:最大子类和长度 起始点 结束点

#include <stdio.h>
//全是负数 输出第一个元素和最后一个元素 最大和为 0
//如果有多个最大和相同 输出最小的那个
int main (){
    int n;
    scanf("%d", &n);//我现在需要的是now对应的那个begin 那个数值而不是那些其他的玩意
    int max = 0,now = 0,begin,end,temp = 0;
    int data[n],mark = 0;
    for(int i = 0; i < n ;++i){
      scanf("%d", &data[i]);
        if(data[i] >= 0)
            mark++;
    }
    if(mark){
        for(int i = 0; i < n ;++i){
        now += data[i];
       if(now < 0){
           now = 0;
           if(i +1<n)
            temp = i+1;
      }
      if(max < now){
          begin = temp;
          max = now;
          end = i;
      }
    }
        if(max == 0)
            printf("0 0 0");
        else
     printf("%d %d %d",max,data[begin],data[end]);
    }else
        printf("%d %d %d",max,data[0],data[n-1]);
    return 0;
}

这题的代码写的并不优美,整体思路还是沿袭上题的在线处理。
但是这题出现了几种特殊的测试情况,所以就多加了几种判断语句。
1.其中对于所有数都小于0 就直接输出 0 然后起始点就是从0到n-1。
2.对于存在大于等于0的情况,则需要考虑 0的个数 如果全是0 则最后的结果就应该是0 0 0.而如果是负数和0,同样全是0.
如果最大子列和前面有多个0,则前面那个变量的更新应该满足下列条件
将新读取的数据加入到当前的最大子列和后最大子列和减小为负数,更新为下一个。亦即从这次的开始移动到上次的结束,借此避免漏掉0.
更简单的那个实验
上述的两个问题是我自己写的时候遇到的两个测试点,以及我的不怎么好的解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值