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

【蓝桥杯每日一题】前缀和算法

🍎 博客主页:🌙@披星戴月的贾维斯
🍎 欢迎关注:👍点赞🍃收藏🔥留言
🍇系列专栏:🌙 蓝桥杯
🌙我与杀戮之中绽放,亦如黎明的花朵🌙
🍉一起加油,去追寻、去成为更好的自己!

蓝桥杯倒计时 45天

文章目录

  • 🍎、前缀和
  • 🍎、例题分析
        • 🍇、[(AcWing)前缀和](https://www.acwing.com/problem/content/797/)
        • 🍇、[(AcWing)子矩阵的和](https://www.acwing.com/problem/content/798/) 二维前缀和
        • 🍇、[(AcWing)截断数组](https://www.acwing.com/problem/content/description/3959/)
  • 🍎、总结

提示:以下是本篇文章正文内容,下面案例可供参考


🍎、前缀和

🍉、前缀和的简单概念

前缀和算法分为一维和二维,一维前缀和可以很快速的求序列中某一段的和。而二维前缀和可以快速求一个矩阵中某个子矩阵的和。

一维前缀和的图解:
在这里插入图片描述

前缀和数组的计算方法:前缀和数组s[i]是由原数组a[i]递推而来的
即:s[i] = s[i - 1] + a[i]

🍎、例题分析

🍇、(AcWing)前缀和

在这里插入图片描述
分析题意:每次询问查询的是原数组l - r区间内的和, 因此我们可以设置一个原数组a和一个前缀和数组

代码示例:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100010;
int a[N];//原数组
int s[N];//前缀合数组
int n, m;int main ()
{cin >> n >> m;for(int i = 1; i <= n; i++) {scanf("%d", &a[i]);s[i] = s[i - 1] + a[i];}while(m --){int l , r;cin >> l >> r;printf("%d\n", s[r] - s[l - 1]);}return 0;
}

解法2:因为本题不需要用到原数组a,则可以直接创建一个前缀和数组s,并且原数组a上 L - R 区间内的值就是前缀和数组 s[R] - s[L - 1];
代码示例:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int m, n;
int s[100010];
int main ()
{cin >> n >> m;for(int i = 1; i <= n; i++){scanf("%d", &s[i]);s[i] += s[i - 1];}while(m --){int ans = 0;int l, r;cin >> l >> r;ans = s[r] - s[l - 1];cout << ans << endl;}return 0;
}

🍇、(AcWing)子矩阵的和 二维前缀和

图解二维前缀和的公式
在这里插入图片描述
在这里插入图片描述
代码示例:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;
int a[N][N], s[N][N];
int n, m, q;
int main ()
{cin >> n >> m >> q;for(int i =  1; i <= n; i++)for(int j = 1; j <= m; j++){scanf("%d", &a[i][j]);s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];//计算二维前缀和}while(q --){int x1, x2, y1, y2;//计算每一次结果cin >> x1 >> y1 >> x2 >> y2;int ans = s[x2][y2] - s[x1 -1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 -1];cout << ans << endl;}return 0;
}

🍇、(AcWing)截断数组

算法:前缀和 + 枚举
在这里插入图片描述
**分析题意:枚举第二刀i处。
在这里插入图片描述
代码示例:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int s[N];
int main ()
{cin >> n;for(int i =1; i <= n; i++){int x;scanf("%d", &x);s[i] = s[i - 1]  + x; //处理前缀和数组s[i]}if(s[n] % 3) //提前判断结束条件{cout << "0" << endl;return 0;}LL res = 0;//因为答案可能爆intfor(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; //s[n] - s[i - 1]是计算i - n区间的总和}printf("%lld\n", res);return 0;
}

🍎、总结

    本文简要介绍了前缀和的简要概念和几道前缀和的经典例题,希望大家读后能有所收获!

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

相关文章:

  • 【C#基础】C# 常用数据结构
  • MySql 及MyBatis数据的批量操作
  • 无代码表格数据库——一个企业数字化新物种
  • 第十三届蓝桥杯国赛 C++ C组 F 题、Python B组 E 题——近似GCD(AC)
  • 分享5款小众良心软件,好用到让人惊艳
  • WAF是什么?一篇文章带你全面了解WAF
  • django项目实战八(django+bootstrap实现增删改查)进阶验证码
  • IP 协议
  • 好用的SQL工具盘点:从学习到工作总有一款适合你
  • Memcache介绍
  • PTA:C课程设计(1)
  • 第二十篇 ResNet——模型讲解
  • LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
  • Vue3通透教程【一】Vue3现状—必然趋势?
  • 打破数据孤岛,Apache Doris 助力纵腾集团快速构建流批一体数仓架构|最佳实践
  • 什么是真正的骨传导耳机,骨传导耳机原理
  • [MySQL]基本数据类型及表的基本操作
  • 华为OD机试 - 好朋友(Python) | 机试题+算法思路+考点+代码解析 【2023】
  • SAP ABAP用程序给用户增加SAP_ALL权限
  • stm32f407探索者开发板(二十)——独立看门狗实验
  • C语言进阶(五)—— 多维数组
  • 06_MySQL多表查询
  • 程序员赚钱指南,兼职社区招募
  • Qt-FFmpeg开发-实现录屏功能(10)
  • JavaEE简单示例——动态SQL元素<where>
  • 本地事务详解
  • e2e测试-Cypress 使用
  • 20230222 【梳理】肿瘤检测 预处理+ML+DL
  • 经典文献阅读之--MSC-VO(曼哈顿和结构约束VIO)
  • 华为OD机试真题Python实现【字母计数】真题+解题思路+代码(20222023