1003题目
Input(输入)
对于每一行测试数据你要输出两行,第一行是"Case #:"(#意味着这是第几个测试数据)第二行包含三个数,最大值,最大子序列的开始位置,结束位置,如果结果不只一个,输出第一个就行,在两个测试结果的输出中间打一个空行。
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
首先把行数,数组大小,数组读进来:
int l_n,s_size,num[100010];
int i,j;
scanf("%d",&l_n);
for(i=0;i<l_n;i++)
{
scanf("%d",&s_szie);
for(j=0;j<s_szie;j++)
scanf("%d",&num[j]);
}
接着就是最关键的找max和上下界了。
有两种情况
一:数组中有正数:最大子序列肯定是正数附近的。如果相加得到负数,把sum等于数组中的下一个数,并把start也提到这个数上;
二:数组中没有正数:全是负数,找到最小的那一个就行;定义一个超小的max,使得第一次sum>max一定成立。刷新max,start,end。end就是当前的数的下标,之后的话就会和这个max比较,只有当sum>max的时候才会刷新,start,end,max一起
int l_n,s_size,num[100010],start,end,temp,sum,max;
int i,j;
scanf("%d",&l_n);
for(i=0;i<l_n;i++)
{
scanf("%d",&s_szie);
sum=0;
max=-121212;
temp=0;
end=0;
for(j=0;j<s_szie;j++)
{
scanf("%d",&num[j]);
if(sum>=0){ sum+=num[j];}//以为sum初始化为0;第一次一定会加到num[0];之后只有当sum>0或等于0时才开始加到sum,即使加一个负数,没小于0也加到sum中,但在if(sum>max)中不符合条件,所以start,end都不会变,直到sum>max
else{sum=num[j];start=j;}//这个else跟在sum>=0的if后面所以j是sum的序列的下一个,就是说前面的序列和相加是小于零的,这是在加后面的只会更小,所以sum=num[j];直接让sum等于下一个数,并把start也挪到j;意思就是扔掉负数,从j开始。当全是负数的时候,就相当于sum=num[j],与max比较,相当于一个一个的比较啦
if(sum>max){max=sum;start=temp;end=j;}//之前定的max是很小的,第一次一定会使得max=sum,这样的话max=sum,start=j(else挪动的j),end就是现在的j;
}
}
在加上一些输出的细节就可以了,例如start,end要+1,最后一行一个空白行就行了之类的。。+_+
#include <stdio.h>
void main()
{
int l_n,s_size,num[100010],start,end,temp,sum,max;
int i,j;
scanf("%d",&l_n);
for(i=0;i<l_n;i++)
{
scanf("%d",&s_size);
sum=0;
max=-121212;
temp=0;
for(j=0;j<s_size;j++)
{
scanf("%d",&num[j]);
if(sum>=0){ sum+=num[j];}/*以为sum初始化为0;第一次一定会加到num[0];之后只有当sum>0或等于0时才开始加到sum,即使加一个负数,没小于0也加到sum中,但在if(sum>max)中不符合条件,所以start,end都不会变,直到sum>max*/
else{sum=num[j];temp=j;}/*这个else跟在sum>=0的if后面所以j是sum的序列的下一个,就是说前面的序列和相加是小于零的,这是在加后面的只会更小,所以sum=num[j];直接让sum等于下一个数,并把temp也挪到j;等到下面确定sum>max时就可以让start=temp来移动start;当全是负数的时候,就相当于sum=num[j],与max比较,相当于一个一个的比较啦*/
if(sum>max){max=sum;start=temp;end=j;}/*之前定的max是很小的,第一次一定会使得max=sum,这样的话max=sum,start=j(else挪动的j),end就是现在的j;*/
}
printf("Case %d:\n",i+1);
printf("%d %d %d\n",max,start+1,end+1);
if(i<l_n-1)printf("\n");
}
}
以上
/*哎,自己想还真是想不到,我能做的就是通过别人的代码倒推思路,最多写个注释*/