杭电oj1003题总是显示Wrong Answer,求指点,谢谢

#include<iostream>#include<string>usingnamespacestd;voidmain()//最大子序列和{intt,n,*a,max,... #include<iostream>
#include<string>
using namespace std;

void main()//最大子序列和
{
int t, n, *a, max, *sum_max;
int k_start, k_end;
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> n;
if (n >= 1 && n <= 100000)
{
a = (int*)malloc(n*sizeof(int));//动态数组
sum_max = (int*)malloc(n*sizeof(int));

for (int j = 0; j < n; j++)
{
cin >> a[j];
}

k_start = k_end = 1;
sum_max[0] = a[0];
max = sum_max[0];

for (int k = 1; k < n; k++)
{
if (sum_max[k - 1] >= 0)
{
sum_max[k] = a[k] + sum_max[k - 1];
if (sum_max[k]>max)
{
max = sum_max[k];
k_end = k + 1;
}
}
else
{
sum_max[k] = a[k];
if (sum_max[k] > max)
{
max = sum_max[k];
k_start = k + 1;
k_end = k + 1;
}
}
}

cout << "Case " << i + 1 << ":" << endl;
cout << max << " " << k_start << " " << k_end << endl;

if (i < t - 1)
{
cout << endl;
}
free(a);
}
}
}
展开
 我来答
瑞候端瓜0Y
2017-04-17 · TA获得超过2039个赞
知道小有建树答主
回答量:323
采纳率:100%
帮助的人:96.9万
展开全部
//对于楼主的原代码,用如下数据进行测试:
//1
//10 -5 -6 3 2 1 -7 6 3 -10 8
//Case 1:
//9 3 8 (楼主原代码的输出,有误) 正确的应该是9 7 8
//楼主的原代码,能计算出最大值,能定出k_end,
//但是,不能定出正确的k_start
//修改楼主的代码,让其能定出正确的k_start.
//
//如果没有限制程序的大小,改用静态数组,不用动态数组,
//调用malloc和free函数,有的编译器提示需要stdlib.h

//测试:
//2
//10 -5 -6 3 2 1 -7 6 3 -10 8
//Case 1:
//9 7 8

//测试:
//1
//10 9 -6 -7 3 2 1 -1 -1 -1 9
//Case 1:
//12 4 10

#include<iostream>
#include<string>
using namespace std;

int main()//最大子序列和
{
    int t, n,  max;
    //原代码int *a, *sum_max;
    int a[100001],sum_max[100001];
    int k_start, k_end;
    cin >> t;
    for (int i = 0; i < t; i++)
    {
        cin >> n;
        if (n >= 1 && n <= 100000)
        {
            //原代码a = (int*)malloc(n*sizeof(int));//动态数组
            //原代码sum_max = (int*)malloc(n*sizeof(int));

            //原代码for (int j = 0; j < n; j++)
            for (int j = 1; j <= n; j++)
            {
                cin >> a[j]; //按照原题目,从a[1]到a[n]
            }

            k_start = k_end = 1;  //原代码k_start = k_end = 1;
            sum_max[1] = a[1]; //原代码sum_max[0] = a[0];
            max = sum_max[1]; //原代码max = sum_max[0];
            int tmp_k_start=k_start; //记录临时start

            //原代码for (int k = 1; k < n; k++)
            for (int k = 2; k <= n; k++)
            {
                if (sum_max[k - 1] >= 0)
                {
                    sum_max[k] = a[k] + sum_max[k - 1];
                    if(sum_max[k]<0)
                    {
                       tmp_k_start=k+1; //记录临时start
                    }
                    if (sum_max[k]>max)
                    {
                        max = sum_max[k];
                        k_end = k ; //原代码k_end = k + 1;
                        k_start=tmp_k_start; //这里,临时start发挥作用
                    }
                }
                else
                {
                    sum_max[k] = a[k];
                    if(sum_max[k]<0)
                    {
                       tmp_k_start=k+1; //记录临时start
                    }
                    if (sum_max[k] > max)
                    {
                        max = sum_max[k];
                        k_start = k ; //原代码k_start = k + 1;
                        k_end = k ; //原代码k_end = k + 1;
                        tmp_k_start=k_end; //记录临时start
                    }
                }
            }

            cout << "Case " << i + 1 << ":" << endl;
            cout << max << " " << k_start << " " << k_end << endl;

            if (i < t - 1)
            {
                cout << endl;
            }

            //原代码free(a);
            //free(sum_max); //释放动态内存

        } //if (n >= 1 && n <= 100000)结束
    }//for (int i = 0; i < t; i++)结束

    return 0;
}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式