基本算法-前缀和 模板+习题

本文介绍了前缀和的概念,展示了如何通过递推和模板计算数组的区间和,以及提供了一个简单的代码示例。通过习题实践,强调算法练习的重要性。
摘要由CSDN通过智能技术生成

一.前缀和模板

1.前缀和讲解

前缀和模板,前缀和比较简单,掌握原理即可写出模板,因此本次先讲解后出模板。

首先了解前缀和的概念。一个长度为n的数组a[0]-a[n-1],它的前缀和s[i]等于a[0]-a[i]的和。

因此利用递推可以得到:s[i]=s[i-1]+a[i]

则如果想计算前缀和,就能利用它可以快速计算出数组中任意区间a[i]\rightarrow a[j]的和,即:

a[i]+a[i+1]+....+a[j-1]+a[j]=s[j]-s[i-1]

可知这说明复杂度为O\left ( n \right )的区间和计算优化到了O\left ( 1 \right )的前缀和计算。

2.前缀和模板

  for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];//这段代码是用来计算从1到n的和。
//s数组是用来存储这个和的,a数组是用来存储1到n的数。
//在每次循环中,都会将s[i]的值更新为s[i-1]加上当前a[i]的值。

  int a,b;
  cin>>a>>b;
  printf("%d\n",s[b]-s[a-1]);//这段代码用来输出从a到b的和。
//s[b]表示从1到b的和,s[a-1]表示从1到a-1的和,这两个值的差就是a到b的和。


二.习题

通过上面模板讲解,我相信大家已经了解了前缀和的思想,快在本地编译器上练习一下吧!

题目描述:

题目讲解:

看完上面模板讲解,相信大家已经理解了,这纯粹是模板题,就不废话了,直接上代码。

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],s[N];
int main(){
  int n,m;
  cin>>n;
  for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
  cin>>m;
  while(m--){
    int a,b;
    cin>>a>>b;
    printf("%d\n",s[b]-s[a-1]);
  }
  return 0;
}

算法要勤加练习,快多多去练习吧!

感谢大家观看,请给作者一个赞和收藏吧!

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想敲代码的小趴菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值