您的位置:首页 > 其它

51Nod - 1081 子段求和 前缀和算法

2017-06-20 17:33 337 查看
真是要炸,一个题看起来挺常规但oj就是一直给 超时,超时,超时,没有办法因为在自己看来算法和结果都是没有问题,所以在代码格式上动了点心思,结果时间虽然有所减少但是超时了。

这是原题描述

51Nod - 1081

下面附上自己最初的代码,当然我认为这是初学者都最先想到的办法。

#include <stdio.h>
int main()
{
long long sum;int a[50000],n,q,i,l;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&q);
for(;q>0;q--)
{
sum=0;
scanf("%d%d",&i,&l);
i=i-1;
for(;l>0;i++,l--)
sum=sum+a[i];
printf("%lld\n",sum);
}
return 0;
}


下面附上从度娘那里学来的前缀和算法,这种算法能够有效的降低算法复杂度以及时间复杂度,在某类型问题里应该是很常用的。

int main()
{
long long sum,b[50001];
int n,q,i,l,j;
b[0]=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&j)// This is what fucking 前缀和算法!
b[i]=j+b[i-1];    // 在输入数据时就将前i和计算出并进行存储。
}
scanf("%d",&q);
for(;q>0;q--)
{
scanf("%d%d",&i,&l);
sum=b[i+l-1]-b[i-1];
printf("%lld\n",sum);
}
return 0;
}


那么到底什么是前缀和算法呢?

就以这道题为例,即为通过提前算好各前i项和,在后面查询时 能够大量减少计算量,避免重复计算,节省时间,不过需要注意相应的下标。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 前缀和