前缀和入门

Login to join training plan

[视频讲解](https://www.yuque.com/benyao-60fk1/axxvmq/ipbbrqhfw1lyxms8?singleDoc# 《前缀和视频讲解》)

嘿,小朋友😀!今天咱们来学习C++里的前缀和入门知识哦。

什么是前缀和

前缀和呀,就像是咱们爬山的时候,记录从山脚下到每一个台阶的累计路程。假如我们要知道从第3个台阶到第5个台阶一共走了多远,就可以用从山脚下到第5个台阶的累计路程减去从山脚下到第2个台阶的累计路程。

在C++里,前缀和就是对一个数组里的元素进行累加,得到一个新的数组,这个新数组里的每个元素都代表原数组从开头到当前位置的元素总和。

怎么计算前缀和

咱们先来看一个简单的数组,比如有这样一个数组a = [1, 2, 3, 4, 5]。我们要计算它的前缀和数组sum

  • 第一个元素的前缀和就是它自己,所以sum[0] = a[0] = 1
  • 第二个元素的前缀和就是第一个元素加上第二个元素,也就是sum[1] = a[0] + a[1] = 1 + 2 = 3
  • 第三个元素的前缀和就是前三个元素相加,sum[2] = a[0] + a[1] + a[2] = 1 + 2 + 3 = 6
  • 以此类推,sum[3] = 1 + 2 + 3 + 4 = 10sum[4] = 1 + 2 + 3 + 4 + 5 = 15

这样我们就得到了前缀和数组sum = [1, 3, 6, 10, 15]

代码实现

下面是用C++实现计算前缀和的代码:

#include <iostream>
using namespace std;

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    int sum[5];
    sum[0] = a[0];
    for (int i = 1; i < 5; i++) {
        sum[i] = sum[i - 1] + a[i];
    }
    for (int i = 0; i < 5; i++) {
        cout << sum[i] << " ";
    }
    return 0;
}

在这段代码里,我们先定义了一个数组a,然后定义了一个和a一样大小的数组sum来存储前缀和。通过一个for循环,我们从第二个元素开始,用前一个位置的前缀和加上当前元素的值,就得到了当前位置的前缀和。最后再用一个for循环把前缀和数组输出。

生活中的例子

存钱罐例子

想象你有一个存钱罐,每天都会往里面放不同数量的零花钱。第一天放了1元,第二天放了2元,第三天放了3元,第四天放了4元,第五天放了5元。我们可以把每天放的钱数看成一个数组[1, 2, 3, 4, 5]

  • 那么到第一天结束的时候,存钱罐里一共有1元,这就是第一个位置的前缀和。
  • 到第二天结束的时候,存钱罐里一共有1 + 2 = 3元,这就是第二个位置的前缀和。
  • 到第三天结束的时候,存钱罐里一共有1 + 2 + 3 = 6元,这就是第三个位置的前缀和。
  • 要是我们想知道从第三天到第五天一共存了多少钱,就可以用第五天结束时存钱罐里的钱(也就是第五个位置的前缀和15元)减去第二天结束时存钱罐里的钱(也就是第二个位置的前缀和3元),得到15 - 3 = 12元。

吃糖果例子

再比如你每天吃不同数量的糖果,第一天吃了2颗,第二天吃了3颗,第三天吃了1颗,第四天吃了4颗,第五天吃了2颗。这就可以看成数组[2, 3, 1, 4, 2]

  • 第一天结束一共吃了2颗糖果,这是第一个位置的前缀和。
  • 第二天结束一共吃了2 + 3 = 5颗糖果,这是第二个位置的前缀和。
  • 要是我们想知道从第三天到第四天一共吃了多少颗糖果,就用第四天结束时吃的糖果总数(也就是第四个位置的前缀和2 + 3 + 1 + 4 = 10颗)减去第二天结束时吃的糖果总数(也就是第二个位置的前缀和5颗),得到10 - 5 = 5颗。

这样是不是就很好理解前缀和啦😉!

#include<bits/stdc++.h>
using namespace std;
int a[105],b[105],n,l,r,s; 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[i]=b[i-1]+a[i];
	}	
	cin>>l>>r;
	s=b[r]-b[l-1];
	cout<<s;
	return 0;
}

Section 1. 前缀和入门

Open

Problem Tried AC Difficulty
598   前缀和样题 94 33 5
599   最大子段和---前缀和法1 60 21 6
600   所有奇数长度子数组的和 28 16 4
 
Enrollees
42
Created By