这是PTA的一道题,原来的是C++代码,看了之后结合自己的C代码做了修改,但是编译后不能通过全部测试点,是我哪里没考虑到么?希望大神帮忙看看,谢谢!
这是C++代码(AC-code):
#include <iostream>
/*
* author:Fayne
* time:2015-9-2 21:24:16
*thisSum用于保存临时序列之和,maxSum更新最大序列和
*left, right分别表示最大序列的左右序号,tempLeft保存临时左端的序号
*/
using namespace std;
int A[10010];
int main()
{
int k, i;
cin >> k;
for (i = 0; i<k; i++)
cin >> A[i];
int left = 0, right = k - 1, maxSum = -1, thisSum = 0, tempLeft;//maxSum赋初值为-1为了解决出现全部序列为负的情况
for (i = 0; i<k; i++)
{
thisSum += A[i];
if (thisSum > maxSum)//如果临时序列和大于最大和,则更新最大和
{
maxSum = thisSum;
left = tempLeft;//将临时左端的序号赋值给左端序号
right = i;
}
else if (thisSum < 0)//thisSum小于0时,从此刻下一个开始重新求和
{
thisSum = 0;
tempLeft = i + 1;//把此刻的下一序号赋值给临时左端序号
}
}
if (maxSum < 0)//maxSum < 0 说明整个序列全为负数,根据题意,最大和应该为0
maxSum = 0;
cout << maxSum << " " << A[left] << " " << A[right] << endl;
return 0;
}
这是我写的C代码(基本全错):
#include<stdio.h>
#include<stdlib.h>
#define LEFT 0
#define RIGHT 1
int MaxSubseqSum4(int A[], int N, int Index[]);
int main()
{
int K;
scanf("%d", &K);
int *A = (int *)malloc((sizeof(int)) * K);
for (int i = 0; i < K; i++)
scanf("%d", &A[i]);
int Index[2] = { 0,K - 1 };
int Result = MaxSubseqSum4(A, K, Index);
printf("%d %d %d", Result, Index[LEFT], Index[RIGHT]);
return 0;
}
int MaxSubseqSum4(int A[], int N, int Index[])
{
int ThisSum, MaxSum;
int i;
int left = 0;
ThisSum = 0;
MaxSum = -1;
for (i = 0; i < N; i++) {
ThisSum += A[i];
if (ThisSum > MaxSum) {
MaxSum = ThisSum;
Index[LEFT] = left;
Index[RIGHT] = i;
}
else if (ThisSum < 0) {
ThisSum = 0;
left = i + 1;
}
}
if (MaxSum < 0)
MaxSum = 0;
return MaxSum;
}