自己的写的代码不知道为啥有点小问题,第五个测试用例一直没通过,
但是按照题解改了一下max_sum的初始值为-1后直接就通过了。下面是按照题解修改后通过的代码:
#include <algorithm>
#include <cstring>
#include <cmath>
#include <ctime>
#include <fstream>
#include <iostream>
#include <istream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
/*
CLion 使用提示 :
批量注释代码 => Ctrl + shift + /
格式化代码 => option + command + L
补全语句 => Shift + command + return
生成构造器,getter和setter方法等 => control + return
行注释 => control + /
块注释 => control + shift + c
*/
#define MAX 10000
void input(int N, int *a);
void output(int N, int *);
int main() {
int N, a[MAX];
scanf("%d", &N);
input(N, a);
output(N, a);
}
void input(int N, int *a) {
for (int i = 0; i < N; ++i) {
scanf("%d", &a[i]);
}
}
/*
10
-1 -2 -3 -4 -5 -6 -7 -8 -9 -10
*/
/*
10
1 2 3 4 5 6 7 8 9 10
*/
//一直不知道咋记录max_begin,看的题解才知道是要用一个临时的下标记录以前
//子序和为负数的下一个位置的下标,然后在每次发现最大子序和之后就把max_left设置为之前记录的临时下标的位置,然后就可以准确记录最大子序和的初始下标了
void output(int N, int *a) {
int sum = 0, max_sum = -1, max_begin = 0, max_end = N-1,temp=0;
for (int i = 0; i < N; ++i) {
sum += a[i];
if (sum < 0) {
sum = 0;
temp=i+1;
} else if (sum > max_sum) {
max_sum = sum;
max_begin=temp;
max_end = i;
}
}
if (max_sum<0) {
max_sum=0;
//max_begin=0;
//max_end=N-1;
}
printf("%d %d %d", max_sum, a[max_begin], a[max_end]);
}