之前一直觉得这个题简单,但是今天再写的时候遇到了一个小障碍
就是边界测试问题,实际上还是我疏忽了,导致出错,但还是为排除
错误提供了一点思路。
错误代码:
#include<iostream>
#include<vector>
using namespace std;
int main() {
int N, value, tmpmax = -1, flagmax, tmpi = 0, tmpj = 0, flagi = 0, flagj = 0;
scanf("%d", &N);
vector<int>V(N);
for (int i = 0; i < N; i++) {
scanf("%d", &V[i]);
if (i == 0) { tmpmax = V[i]; flagmax = V[i]; continue;}
if (tmpmax < 0) { tmpmax = V[i]; tmpi = V[i]; tmpj = V[i]; }
else { tmpmax += V[i]; tmpj = V[i]; }
if (tmpmax > flagmax) {
flagmax = tmpmax;
flagj = tmpj;
flagi = tmpi;
}
}if (flagmax < 0)printf("0 %d %d", V[0], V[N - 1]);
else printf("%d %d %d", flagmax, flagi, flagj);
return 0;
}
运行结果
原因在于没正确初始化第一个元素,说实话这是因为我在用下标寻值的基础上修改得来的代码,所以这个初始化的全是0,而不是下标0对应的值。
下标寻值:
#include<iostream>
#include<vector>
using namespace std;
int main() {
int N, value, tmpmax = -1, flagmax, tmpi = 0, tmpj = 0, flagi = 0, flagj = 0;
scanf("%d", &N);
vector<int>V(N);
for (int i = 0; i < N; i++) {
scanf("%d", &V[i]);
if (i == 0) { tmpmax = V[i]; flagmax = V[i]; continue;}
if (tmpmax < 0) { tmpmax = V[i]; tmpi = i; tmpj = i; }
else { tmpmax += V[i]; tmpj = i; }
if (tmpmax >flagmax) {
flagmax = tmpmax;
flagj = tmpj;
flagi = tmpi;
}
}if (flagmax < 0)printf("0 %d %d", V[0], V[N - 1]);
else printf("%d %d %d", flagmax, V[flagi], V[flagj]);
return 0;
}
不过这也不能说是坏处,以后写代码遇到测试不过可以试一下单值检测。