今天试了一下1003,发现不是很难,结果我错了!
我用了一种最直接的方法,结果超时了,于是我便去寻找更简洁的方法。结果还真找到了,于是自己编写了这个程序,结果当然AC啦!这个程序的算法很巧妙,值得学习!!源代码如下:
#include <stdio.h>
int main(void)
{
int a,b,sum,max,st,en,e[100000],zo;
int g=1;
scanf("%d",&a);
while(a--)
{
st=zo=en=1;
max=-1001;
sum=0;
scanf("%d",&e[0]);
for(b=1;b<=e[0];b++)
{
scanf("%d",&e[b]);
sum+=e[b];
if(sum>max)
{
max=sum;
st=zo;
en=b;
}
if(sum<0)
{
sum=0;
zo=b+1;
}
}
printf("Case %d:\n",g++);
printf("%d %d %d\n",max,st,en);
if(a>0)
printf("\n");
}
return 0;
}
在这里,我同时也发一个自己最原先的程序源代码,就是那个超时了的代码,供大家比较,如下:
#include <stdio.h>
int main(void)
{
int n,b,t,k,max,st,en,fin,a[100000],stf,enf;
k=1;
scanf("%d",&n);
while(n--)
{
max=0;
scanf("%d",&a[0]);
for(t=1;t<=a[0];t++)
{
scanf("%d",&a[t]);
}
for(st=1;st<=a[0];st++)
{
for(en=st;en<=a[0];en++)
{
fin=0;
b=st;
while(b<=en)
{
fin=fin+a[b];
b++;
}
if(fin>=max)
{
max=fin;
stf=st;
enf=en;
}
}
}
if(max==0)
{
stf=0;
enf=0;
}
printf("Case %d:\n%d %d %d",k++,max,stf,enf);
if(k<n)
printf("\n\n");
else
printf("\n");
}
return 0;
}
天高任鸟飞!!海阔纵鱼跃!!!