当前位置: 首页 > news >正文

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

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

文章目录

  • 前言
  • 前缀和:
    • 什么是前缀和
    • 题目:
    • 输入格式
    • 输出格式
    • 数据范围
    • 输入样例:
    • 输出样例:
    • 做题思路:
    • 代码:
  • 截断数组
    • 题目:
    • 输入格式
    • 输出格式
    • 数据范围
    • 输入样例1:
    • 输出样例1:
    • 输入样例2:
    • 输出样例2:
    • 输入样例3:
    • 输出样例3:
    • 解题思路:
    • 代码:
  • 最后


前言

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

首先先写上几句话:献给坚持创作的我和点开这篇文章希望进步的你
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.不要以为别人事事都拿你当回事,其实,你在他们眼里,你只配给他们舔鞋。

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

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

http://www.lryc.cn/news/6704.html

相关文章:

  • 研报精选230214
  • 【SSL/TLS】准备工作:证书格式
  • Linux常用命令---系统常用命令
  • C 结构体
  • 手语检测识别
  • android fwk模块之Sensor架构
  • 安装less-loader5出现webpack版本不兼容
  • Java 网络编程
  • BEV学习记录
  • Webrtc Native C++切换音频输入源
  • 裸辞5个月,面试了37家公司,终于找到理想工作了
  • Mybatis-plus@DS实现动态切换数据源应用
  • SpringBoot的创建和使用
  • 居家电话客服宝典
  • 开发方案设计
  • 文件路径模块pathlib
  • spring cloud篇——什么是服务熔断?服务降级?服务限流?spring cloud有什么优势?
  • Tomcat构建
  • 入门深度学习——基于全连接神经网络的手写数字识别案例(python代码实现)
  • 预算砍砍砍,IT运维如何降本增效
  • 10.Jenkins用tags的方式自动发布java应用
  • 2023新华为OD机试题 - 相同数字的积木游戏 1(JavaScript)
  • 重构之改善既有代码的设计(一)
  • Kotlin data class 数据类用法
  • 随笔-老子不想牺牲了
  • 三种查找Windows10环境变量的方法
  • STM32单片机DS18B20测温程序源代码
  • java日志查看工具finder介绍
  • 手写现代前端框架diff算法-前端面试进阶
  • 【半监督医学图像分割 2022 MICCAI】CLLE 论文翻译