1007 Maximum Subsequence Sum (25 分)
题目链接
算法分析
我用了vector数据结构,来存可能为解的和为整数的连续子列,然后再对每一个子列进行处理,末尾的负数和0给删掉,然后输出结果就可以了。
测试点
测试点二和测试点六:问题在没有把末尾的0删掉(i,j最小)
测试点五:“段错误”,最后发现是用vector的pop_back导致段错误。修改了一下就没问题了。
代码实现
#include<bits/stdc++.h>
using namespace std;
#define N 10005
int t;
int SK[N], x[N];
vector< int >Vec[N];
int L[N], R[N];
int main(){
int n;
bool flag = 1;
int Sum = 0;
scanf("%d", &n);
for(int i = 1; i <= n; ++ i){
scanf("%d", &x[i]);
if(Sum + x[i] >= 0){
flag = 0;
Vec[t].push_back(x[i]);
Sum += x[i];
}
if(Sum + x[i] < 0 || i == n){
SK[t] = Sum;
Sum = 0;
++ t;
}
}
if(flag){
printf("0 %d %d", x[1], x[n]);
return 0;
}
for(int i = 0; i < t; ++ i){
if(Vec[i].size()){
L[i] = Vec[i][0];
R[i] = Vec[i][Vec[i].size() - 1];
}
for(int j = Vec[i].size() - 1; j >= 0; -- j)
if(Vec[i][j] <= 0){
SK[i] -= Vec[i][j];
R[i] = Vec[i][j - 1];
}
else break;
}
int Max = -1, Max_t;
for(int i = 0; i < t; ++ i)
if(SK[i] > Max){
Max = SK[i];
Max_t = i;
}
printf("%d %d %d", SK[Max_t], L[Max_t], R[Max_t]);
return 0;
}
学习柳神
柳神的代码思路:
我的理解:我和柳神代码的最大区别在于,我把许多没有用的元素也压到了vector容器中,之后还去遍历一次,这浪费了大把的程序运行时间,同时还使代码量剧增。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
scanf("%d", &n);
vector<int> v(n);
int leftindex = 0, rightindex = n - 1, sum = -1, temp = 0, tempindex = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &v[i]);
temp = temp + v[i];
if (temp < 0) {
temp = 0;
tempindex = i + 1;
} else if (temp > sum) {
sum = temp;
leftindex = tempindex;
rightindex = i;
}
}
if (sum < 0) sum = 0;
printf("%d %d %d", sum, v[leftindex], v[rightindex]);
return 0;
}
真的太强了!ORZ