这个题做的我脑壳疼,题目并不难,非常简单的动态规划思想就好,该的OJ对输出格式太严格了,我只是case后边的冒号位置不对,让我WA了一下午,蛋都碎了。
马虎要不得啊。
#include<iostream>
using namespace std;
int main()
{
int T,N;
int a[100001]={0};
cin>>T;
for(int x=1;x<=T;x++)
{
cin>>N;
for(int i=0;i<N;i++)
cin>>a[i];
int max=-1001,sum=0;
int startp=0,endp,c[2]={0};
for(endp=0;endp<N;endp++)
{
sum=a[endp]+sum;
if(max<sum)
{
max=sum;
c[0]=startp;
c[1]=endp;
}
if(sum<0)
{
sum=0;
startp=endp+1;
}
}
cout<<"Case "<<x<<":"<<endl;
cout<<max<<" "<<c[0]+1<<" "<<c[1]+1<<endl;
if(x!=T)
cout<<endl;
}
}
上边我的AC代码,做完之后又发现了一个大佬的代码,更简练。不需要申请数组就可以了,又get了。
#include <iostream>
using namespace std;
int main()
{
int T,N,num,start,end;
cin>>T;
for(int k=0;k<T;k++)
{
cin>>N;
int max=-1001,sum=0,temp=1;
for(int i=0;i<N;i++)
{
cin>>num;
sum+=num;
if(sum>max)
{
max=sum;
start=temp;
end=i+1;
}
if(sum<0)
{
sum=0;
temp=i+2;
}
}
cout<<"Case "<<k+1<<":"<<endl<<max<<" "<<start<<" "<<end<<endl;
if(k!=T-1) cout<<endl;
}