有哪些方法可以解决超时问题?
超时,困扰了我好久,每每遇到一个问题,代码往往正确,但提交后 Time Limit Exceeded(超时)。遇到超时,我就不会解决。。。请大家 给点意见,通常解决超时有哪些方法?
比如 这道题目:让你求最大子序列之和。先输入T(1<=T<=20)组测试数据,再输入N(1<=N<=100000), 接下来N个整数(在-1000到1000之间)。输出:第一行:测试的组数:"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
这是我的代码:(老是超时。。)
#include <stdio.h>
int main()
{
int i,k,n,sumk,x=0,t;
int s[100000],sum[100000],a[100000]; //sum[]存放子序列的和。数组空间不要担心过大 ,这个没问题的。
scanf("%d",&t);
while(t--)
{
x++;//控制输出的组数,见下面。
sumk=k=0; //初始化为0
scanf("%d",&n);//输入个数
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
if(sumk>=0) //判断sumk是否大于0
{
sumk+=s[i];
a[i]=k;
}
else
{
sumk=s[i];
a[i]=k=i;
}
sum[i]=sumk;//把每个子序列的和存放在sum[]里
}
k=0;
for(i=1;i<n;i++)
if(sum[i]>sum[k]) //比较找出最大子序列的和
k=i;
printf("Case %d:\n",x);
printf("%d %d %d\n",sum[k],a[k]+1,k+1);
if(t!=0)//判断输出的空行
printf("\n");
}
return 0;
}
请大家给点意见,要慷慨解囊哦!!!
谢谢!!!
[ 本帖最后由 tzzy 于 2009-8-11 17:03 编辑 ]