1:这个代码目前在自己机子上没有问题,但是一直WA
代码
/******************************************
/*    杭电ACM1003:Max Sum
/*        2010/10/09 17:00
/*    VS2010 Win7
/*    zhuiqiuzhuoyue@hotmail.com
/*    
*****************************************
*/

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

int main(){
    
int lines;
    cin
>>lines;    //输入行数
    int* sum  = new int[lines];//每行满足要求子序列的和
    int*start = new int[lines];//每行满足要求子序列的起始点
    int* end  = new int[lines];//每行满足要求子序列的终点

    
for(int i=0;i<lines;i++)
    {
        
int num;
        cin
>>num;
        
int* data = new int[num];//每行输入的数字
        
        
//输入
        for(int j=0; j<num; j++)
            cin
>>data[j];    
        
//计算符合要求的子序列
        int max=INT_MIN;
        
int cur=0;
        
int start_cur=0;
        start[i]
=0;
        
for(int j=0;j<num;j++)
        {
            cur
+=data[j];
            
if(cur>=max)    //如果加上下一个数字大于原来的最大值,则可扩宽子序列
            {
                max
=cur;
                start[i]
=start_cur+1;
                end[i]
=j+1;
            }
            
else if(cur<0)//如果继续添加直到小于0,那么这个子序列应及时截止
            {
                cur
=0;
                start_cur
=j+1;
            }
        }
        sum[i]
=max;
        delete []data;
    }
    
//输出
    for(int i=0;i<lines;i++)
    {
        cout
<<"Case "<<i+1<<":"<<endl;
        cout
<<sum[i]<<" "<<start[i]<<" "<<end[i]<<endl<<endl;
    }

    delete[] sum;
    delete[] end;
    delete[] start;

    
    
return 0;
}

 

 
2:这个是别人成功的
代码
#include <iostream>
int main()
{
    
int i,t;
    scanf(
"%d",&t);
    
for(i=1;i<=t;i++)
    {
        
int j,n,sum,max=INT_MIN,b,begin,end,in//由于sum也可能为负,所以max=INT_MAX是保险的
        scanf("%d",&n);
        
for(j=b=sum=0;j<n;j++)
        {
            scanf(
"%d",&in);
            sum
+=in;
            
if(sum>max) {max=sum;begin=b;end=j;} //之前一直想不明白为什么这一句
            if(sum<0) {b=j+1;sum=0;} //和下面一句掉转会WA,原来是数据全负的作怪
        }
        printf(
"Case %d:\n",i);
        printf(
"%d %d %d\n",max,begin+1,end+1);
        
if(i-t) printf("\n");
    }
    
return 0;
}

 

 

3:自己照着改了一个,C++的,经一番周折,找到一个自己不太熟悉的错误,最终运行成功
代码

/*
*****************************************
/*    杭电ACM1003:Max Sum
/*        2010/10/09 17:00
/*    VS2010 Win7
/*    zhuiqiuzhuoyue@hotmail.com
*****************************************
*/

#include 
<iostream>
using namespace std;

int main(){
    
int lines;
    cin
>>lines;
    
for(int i=0;i<lines;i++)
    {
        
int num,data;
        
int sum=0;
        
int max=INT_MIN;
        
int start=0;
        
int end=0;
        
int s=0;
        cin
>>num;
        
for(int j=0;j<num;j++)
        {
            cin
>>data; sum+=data;
            
if(sum>max)
            {
                max
=sum; start=s; end=j;
            }
            
if(sum<0)
            {
                s
=j+1; sum=0;
            }
        }
        cout
<<"Case "<<i+1<<":"<<endl;
        cout
<<max<<" "<<start+1<<" "<<end+1<<endl;
        
if((i+1)!=lines) cout<<endl;// 输出到最后结束,不再需要有空行
    }
    
return 0;
}

 

一点小感受:
1:注意各种边界值,输入的时候考虑全面,像这次存在输入全为负数的情况,就没想到;
2:目前还不能肯定的一点:输入不必等全部输入完成,可以输入一组,显示一组答案,如第二个程序;
3:第二天又重新修改了一下第三个程序,终于不再报Presentation Error的错误了,原因在倒数第三行,自己以前不熟悉这错误,废了把劲

 

posted on 2010-10-10 23:41  子桥  阅读(657)  评论(3编辑  收藏  举报