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