原题链接:蓝桥杯算法提高VIP-和最大子序列
解题思路:
用滑动窗口思想解决问题比较简单,不过这题不需要记明窗口,只需要判断当前序列的和
只要当前序列的和不小于0,当前序列就有成为和最大的可能
如果当前序列和小于零,一定会使下一个序列的和变小
所以此时要刷新序列起点,即令和重置为0
在所有序列和中记下最大值即为所求答案

参考代码:
#include <stdio.h>
 
int main()
{
    int n;                  //定义n
    scanf("%d", &n);        //输入n
    int num;
    int ans = 0;            //定义答案
    int sum = 0;            //定义序列和
    while (n--)             //循环n次
    {
        scanf("%d", &num);      //输入数字
        sum += num;             //加入序列和
        ans = (ans > sum) ? ans : sum;      //维持答案为最大
        if (sum < 0)    sum = 0;            //若序列和小于0,刷新为0
    }
    printf("%d\n", ans);        //输出答案
    return 0;
}过一段时间又看看,发现代码还是有 bug 的,比如如果输入的数据都为负数,答案就会是 0
主要是 ans 的初始化 ( 为 0 ) 不合理
题目里说了数据范围 -10000 <= A[i] <= 10000
那么可以给 ans 初始化为 -10001 ,也可以是 INT_MIN 或者 -0x3f3f3f3f
又或者先输入第一个数,把第一个输入的数作为ans 和 sum 的初始化
0.0分
11 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
 
发表评论 取消回复