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;
}

浙公网安备 33010602011771号