*题意:求给定序列的子序列的最大和,并输出最大和子序列的起始位置和结束位置
*解题思路:首先,这题是一道水题,首先将第一位数的和记为最大和以及sum,也记作起始位置和终止位置,如果sum加上后面一位数小于后面一个数本身,则sum=这个数,起始位置与终止位置也是这个数,反之,则sum+=这个数,终止位置变成这个数,然后比较sum与max,如果sum>max,则max=sum,就这样依次向后,最终就能求出最大和以及初始位置和结束为止
*感想:第一次提交,因为输出格式上 case后面漏了个:,结果提示我答案错误,我还以为是逻辑写错了,找了半天也没找到,又运行了一边程序,结果才发现输出有 错误,也是醉了,以后写完的程序一定要在本地运行一遍再交。
*源码
# include <iostream>
using namespace std;
int main()
{
int T,n,i,j,ans,start,end,p,sum,a[100001];
cin>>T;
for(i=1;i<=T;i++)
{
if(i!=1)
cout<<endl;
cin>>n;
for(j=1;j<=n;j++)
cin>>a[j];
ans=0;
start=end=p=1;
ans=sum=a[1];
for(j=2;j<=n;j++)
{
if(sum<0)
{
sum=a[j];
p=j;
}
else
{
sum+=a[j];
}
if(sum>ans)
{
ans=sum;
start=p;
end=j;
}
}
cout<<"Case "<<i<<":"<<endl;
cout<<ans<<" "<<start<<" "<<end<<endl;
}
return 0;
}
Problem A
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 148 Accepted Submission(s) : 23
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Case 1: 14 1 4 Case 2: 7 1 6