一、题目编号:
1001
二、简单题意:
给出一个序列a[1],a[2],a[3],…,a[N],求从该序列中取出连续一个子段,使这个子段的和最大。
1001
二、简单题意:
给出一个序列a[1],a[2],a[3],…,a[N],求从该序列中取出连续一个子段,使这个子段的和最大。
三、解题思路形成过程
老师上课讲过这个题,思路很清晰。sum表示当前所算序列的和,maxsum表示序列的最大和。边循环输入边判断,如果当前的和小于0,就放弃这个序列,否则就加上当前数,比较这个当前序列的和,maxsum,当前序列的和大于maxsum则将当前序列的和赋值给maxsum,最终输出maxsum即可。
老师上课讲过这个题,思路很清晰。sum表示当前所算序列的和,maxsum表示序列的最大和。边循环输入边判断,如果当前的和小于0,就放弃这个序列,否则就加上当前数,比较这个当前序列的和,maxsum,当前序列的和大于maxsum则将当前序列的和赋值给maxsum,最终输出maxsum即可。
四、感想
思路老师讲过了,并不难。重点是输出的格式!!感觉代码都对了,但是每次提交都是wa,改了n遍啊,,最终终于发现是输出格式的问题,晕。。
思路老师讲过了,并不难。重点是输出的格式!!感觉代码都对了,但是每次提交都是wa,改了n遍啊,,最终终于发现是输出格式的问题,晕。。
五、AC代码
#include<iostream>
using namespace std;
int main()
{
int t,n,a[100001],x,y,e;
long long maxsum,sum;
int k=1;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(i==1)
{
sum=maxsum=a[i];
e=x=y=i;
}
else
{
if(sum<0)
{
sum=a[i];
e=i;
}
else
sum=sum+a[i];
using namespace std;
int main()
{
int t,n,a[100001],x,y,e;
long long maxsum,sum;
int k=1;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(i==1)
{
sum=maxsum=a[i];
e=x=y=i;
}
else
{
if(sum<0)
{
sum=a[i];
e=i;
}
else
sum=sum+a[i];
}
if(sum>maxsum)
{
maxsum=sum;
x=e;
y=i;
}
}
cout<<"Case"<<" "<<k++<<":"<<endl;
cout<<maxsum<<" "<<x<<" "<<y<<endl;
if(t>0)
cout<<endl;
}
return 0;
}
if(sum>maxsum)
{
maxsum=sum;
x=e;
y=i;
}
}
cout<<"Case"<<" "<<k++<<":"<<endl;
cout<<maxsum<<" "<<x<<" "<<y<<endl;
if(t>0)
cout<<endl;
}
return 0;
}