杭电AMC1003:Max Sum

1:这个代码目前在自己机子上没有问题,但是一直WA
ExpandedBlockStart.gif 代码
/* *****************************************
/*    杭电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:这个是别人成功的
ExpandedBlockStart.gif 代码
#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++的,经一番周折,找到一个自己不太熟悉的错误,最终运行成功
ExpandedBlockStart.gif 代码

/*
*****************************************
/*    杭电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的错误了,原因在倒数第三行,自己以前不熟悉这错误,废了把劲

 

转载于:https://www.cnblogs.com/ziqiao/archive/2010/10/10/1847504.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值