SCAU 18708 最大子段和

18708 最大子段和
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题 语言: G++;GCC

Description
一个整数序列,选出其中连续且非空的一段使得这段和最大。
注意当题目要求输入输出的数据量很大时,尽量使用scanf和printf。 c++提供的cin和cout速度比较慢,有可能在读取数据和输出数据时导致超时。

输入格式
第一行是一个正整数N,表示了序列的长度(0=<N<=200000)。
第二行包含N个绝对值不大于10000的整数ai。

输出格式
一个整数,为最大的子段和。子段的最小长度为1。数据确保结果在类型int范围内。

输入样例
7
2 -4 3 -1 2 -4 3

输出样例
4

提示
【样例说明】
2,-4,3,-1,2,-4,3中,最大的子段和为4,该子段为第三元素至第五元素,即3,-1,2。

做这道题自己界面输出是正确的,但是交到OJ上,答案总是为0;
原因是使用了ios::sync_with_stdio(false);
并且用cin读取 第一个整数

点击查看代码

#include <iostream>
#include <string>
#include <list>
#include <math.h>
#include <algorithm>
using namespace std;
//#define int long long
#define double long double
#define endl "\n"
//#define IOS ios::sync_with_stdio(false);    //这个禁用同步记得关掉

void debug() {
    cout << "debug" << endl;
}



void solve() {
    int n;
    int a[200005];
    cin >> n;           //没关掉禁用同步,使用是没问题的
    for (int i = 1;i <= n;i++) {
        scanf("%d", &a[i]);
    }
    int num = 0, max_num = 0;
    for (int i = 1;i <= n;i++) {

        if (a[i] > 0) {
            num += a[i];
        }
        else if (a[i] < 0)
        {
            if (num - abs(a[i]) <= 0) {
                num = 0;
            }
            else
            {
                num += a[i];
            }
        }
        max_num = max(num, max_num);

    }
    printf("%d",max_num);


}

signed main() {
   
    int t = 1;
    //cin >> t;
    while (t--)
        solve();
    return 0;
}

`
posted @ 2024-11-27 11:05  scau  阅读(28)  评论(0)    收藏  举报