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