UVA_507

这个题目实际上就是在求一个最大子串和。由于具有最大和的子串是具有这样的性质的,第一项不为负,并且,从第一项开始累加,中间不会有中间结果为负。因为一旦中间结果为负,我们是可以抛弃前半段的,因此就矛盾了。

然后我们便根据这个特征去寻找具有最大和的子串即可。

#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,t,n,tt,x,y,tx,sum,ans;
scanf("%d",&t);
for(tt=0;tt<t;tt++)
{
scanf("%d",&n);
tx=x=ans=sum=0;
for(i=0;i<n-1;i++)
{
scanf("%d",&k);
sum+=k;
if(sum<0)
{
tx=i+1;
sum=0;
continue;
}
if(sum>ans||(sum==ans&&tx==x))
{
x=tx;
y=i;
ans=sum;
}
}
if(ans==0)
printf("Route %d has no nice parts\n",tt+1);
else
printf("The nicest part of route %d is between stops %d and %d\n",tt+1,x+1,y+2);
}
return 0;
}


posted on 2011-09-28 22:40  Staginner  阅读(385)  评论(0编辑  收藏  举报