算法出现问题,但不知道错那里了?
算法要求是:https://pta.patest.cn/pta/test/558/exam/4/question/7400
我的算法是:
#include <stdio.h>int main()
{
int n;
scanf("%d", &n);
int a[n];
int i, j, k, h;
int q = 0;
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int max;
max = 0;
j = 0;
k = a[0];
h = a[n - 1];
for (i = 0; i < n; i++) {
if (a[i] >= 0) {
q = 1;
}
j = j + a[i];
if (j < a[i]) {
j = a[i];
if ((j > max) || ((j == max) && (j == 0))) {
k = a[i];
}
}
if (j > max) {
max = j;
h = a[i];
}
}
if (max == 0 && q == 1) {
k = 0;
h = 0;
}
if (q == 0) {
max = 0;
k = a[0];
h = a[n - 1];
}
//printf("%d\n", j);
printf("%d %d %d", max, k, h);
return 0;
}
提交时总是出现错误:
可我自己看了好多天,验证了好多数据也不知道错哪了,该怎么改,求大神指导。
回答:
#include <stdio.h>int main() {
int maxSum, i, j, curSum, curI, n, k;
scanf("%d", &n);
int nums[n];
for (k = 0; k < n; k++) {
scanf("%d", &nums[k]);
}
maxSum = -1; // 子序列最大和
i = nums[0]; // 具有最大和的子序列起始与结束元素的值
j = nums[n - 1];
curSum = 0; // 当前子序列的和
curI = nums[0]; // 当前子序列起始元素的值
for (k = 0; k < n; k++) {
// 若当前子序列的和小于0则直接丢弃,以当前元素为起点重新开始
if (curSum < 0) {
curSum = curI = nums[k];
} else { // 否则继续求和
curSum += nums[k];
}
// 当前子序列的和计算完毕后,与之前已保存的最大子序列的和
// 比较,如果较大就更新之,同时更新起始和结束元素的值
if (curSum > maxSum) {
maxSum = curSum;
i = curI;
j = nums[k];
}
}
// 这个判断用来检查是否所有元素都是负值(这也是将maxSum初始化为-1的原因)
if (maxSum < 0) {
maxSum = 0;
}
printf("%d %d %d", maxSum, i, j);
return 0;
}
回答:
输入
4
0 0 0 0
输出应该是
0 0 3
而你的输出是
0 0 0
应该找最长的
以上是 算法出现问题,但不知道错那里了? 的全部内容, 来源链接: utcz.com/p/195172.html