备战蓝桥杯【一维前缀和】

简介: 备战蓝桥杯【一维前缀和】
🌹作者:云小逸
📝个人主页: 云小逸的主页
📝Github: 云小逸的Github
🤟motto:要敢于一个人默默的面对自己, ==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟
👏专栏:C++👏 👏专栏:Java语言👏
👏专栏:C语言初阶👏👏专栏:数据结构👏

前言

今天这篇文章是备战蓝桥杯的第五篇文章,这一篇文章是写的是一维前缀和和二维前缀和的相关算法问题,如有错误,请私信并告知,十分感谢!!!
———————————————————————————————————————————

首先先写上几句话:献给坚持创作的我和点开这篇文章希望进步的你
1.所谓现实就是,人没有钱就不如鬼,汤没有盐就不如水,慢慢地你就会发现,一颗好的心,比不上一张好的嘴。

2.不要总怪别人对你以貌取人,毕竟别人的心太远,打脸就在眼前。

3.假如你现在不满意你所做的工作,要么请你辞职,要么请你闭嘴。

4.俗话说,热水不能包治百病,情话不能陪你过一生,人民币都有造假,请远离那些对你忽冷忽热的人。

5.你总以为你放不下的人同样会放不下你,其实不是,鱼没有了水会死,水没有了鱼会变得更清澈。

前缀和:

什么是前缀和

前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)。前缀和分为一维前缀和,以及二维前缀和。前缀和是一种重要的预处理,==能够降低算法的时间复杂度。==
例如:
数组: a[1], a[2], a[3], a[4], a[5], …, a[n] 下标从1开始
前缀和: S[i] = a[1] + a[2] + a[3] + … + a[i]包含其自身

这里的下标从1开始,这样便于理解,不用进行下标的转换,省着在做题的时候,容易把自己绕糊涂。

s[0] = 0
s[1] = a[1]
s[2] = a[1] + a[2]

题目:

输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。

对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。

输入格式

第一行包含两个整数 n 和 m。

第二行包含 n 个整数,表示整数数列。

接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。

输出格式

共 m 行,每行输出一个询问的结果。

数据范围

1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤1000​

输入样例:

5 3
2 1 3 6 4
1 2
1 3
2 4

输出样例:

3
6
10

做题思路:

使用一个预处理数组s来存储从a[1]到a[i]的和,然后使用s[r]-s[l-1]来计算从a[l]到a[r]的和。

代码:

#include<iostream>
using namespace std;

const int N=100010;
int n,m;
int a[N],s[N];

int main()
{
    scanf("%d%d",&n,&m);
    
    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];//数组下标从零开始
    
    while(m--)
    {
        int l=0,r=0;
        scanf("%d%d",&l,&r);
        printf("%d\n",s[r]-s[l-1]);//这里要注意区间间的运算
    }

    return 0;
}

截断数组

题目:

给定一个长度为 n 的数组 a1,a2,…,an。

现在,要将该数组从中间截断,得到三个非空子数组。

要求,三个子数组内各元素之和都相等。

请问,共有多少种不同的截断方法?

输入格式

第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an。

输出格式

输出一个整数,表示截断方法数量。

数据范围

前六个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤105,−10000≤ai≤10000。

输入样例1:

4
1 2 3 3

输出样例1:

1

输入样例2:

5
1 2 3 4 5

输出样例2:

0

输入样例3:

2
0 0

输出样例3:

0

解题思路:

解题思路是使用前缀和来求解。首先,通过输入n个数,构建一个前缀和数组s,其中s[i]表示前i个数的和。然后,判断s[n]是否能被3整除,如果不能,则输出0,表示无解。如果能,则遍历s数组,计算s[i-2]和s[n]-s[i-1]是否等于s[n]/3,如果相等,则表示存在一个子数组,其和为s[n]/3,最后输出符合条件的子数组的个数。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=100010;
int n=0;
int s[N];

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&s[i]);
        s[i]+=s[i-1];
    }
    
    if(s[n]%3)
    {
        puts("0");
        return 0;
    }
    
    long long res=0;
    for(int i=3,cnt=0;i<=n;i++)
    {
        if(s[i-2]==s[n]/3) cnt++;
        if(s[n]-s[i-1]==s[n]/3) res+=cnt;
    }
    
    printf("%lld",res);
    return 0;
}

在这里插入图片描述


最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.当你的能力不能取代的时候,你自身的弱点才有可能被人忽视。

2.请你擦亮自己的眼睛,看清楚这个现实的社会,有用的时候,你在别人的手中就是一块宝,没有用的时候,你在别人的手中就是垃圾,随处可扔。

3你身边一定有不少这样的人,平时看起来人畜无害,遇到事的时候,就先给你捅刀子。

4.这人一走,茶也跟着凉,这是自然规律,这人还没走,茶还跟着凉,这是世态炎凉。

5.不要以为别人事事都拿你当回事,其实,你在他们眼里,你只配给他们舔鞋。

最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!

目录
相关文章
|
7月前
|
Python
【备战蓝桥杯】——循环结构
【备战蓝桥杯】——循环结构
54 1
|
6月前
|
Java API
备战第十五届蓝桥杯Java软件开发大学B组常见API记录
备战第十五届蓝桥杯Java软件开发大学B组常见API记录
44 0
|
7月前
|
算法 安全 定位技术
【刷题】备战蓝桥杯 — dfs 算法
dfs算法在数据较小的情况下可以使用。 一定一定要确定好终止条件,避免栈溢出。 相应做好回溯,保证每次的遍历都是不一样的选择,避免少结果。 针对题目进行对应细节处理,有能力的话可以进行剪枝优化!!!
84 0
|
7月前
蓝桥杯备战刷题-滑动窗口
蓝桥杯备战刷题-滑动窗口
55 0
|
7月前
|
索引 Python 容器
【备战蓝桥杯】探索Python内置标准库collections的使用
【备战蓝桥杯】探索Python内置标准库collections的使用
100 1
|
7月前
|
开发者 Python
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
75 1
|
7月前
【备战蓝桥杯】——Day1
【备战蓝桥杯】——Day1
57 0
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
110 0
|
7月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
86 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
88 0