python 基础知识点(蓝桥杯python科目个人复习计划26)

今日复习内容:基础算法中的前缀和

1.定义:

  • 前缀和:对于一个长度为n的列表a,前缀和为: sum[i] = a[1] + ...+a[i];
  • 例如:a = [1,2,3,4,5],则它的前缀和数组sum为:[1,3,6,10,15]。

2.前缀和的性质

  • sum[i] = sum[i-1] + a[i]
  • a[l] + ... + a[r] = sum[i] - sum[l-1]
  • 第一条性质用于处理前缀和
  • 第二条性质可以在O(1)的时间内求出区间和

将其转化为代码得:

第一种方式:

# 求出a的前缀和
def get_presum(a):
    n = len(a)
    sum = [0] * n
    sum[0] = a[0]
    for i in range(1,n):
        sum[i] = sum[i-1] + a[i]
    return sum
# 求区间a[i]...a[r]之和
def get_sum(sum,l,r):
    if 1 == 0:
        return sum[r]
    else:
        return sum[r] - sum[l - 1]

a = [1,2,3,4,5]
sum = get_presum(a)
print('a = ',a)
print('sum = ',sum)
print(get_sum(sum,2,3))

运行结果:

第二种方式:

from itertools import accumulate
# 求出a的前缀和
def get_presum(a):
    sum = list(accumulate(a))
    return sum
# 求区间a[i]...a[r]之和
def get_sum(sum,l,r):
    if l == 0:
        return sum[r]
    else:
        return sum[r] - sum[l-1]

a = [1,2,3,4,5]
sum = get_presum(a)
print('a = ',a)
print('sum = ',sum)
print(get_sum(sum,2,3))

运行结果:

3.习题

例题1:区间次方和

题目描述:

给定一个长度为n的整数数组a以及m个查询。

每个查询包括三个整数l,r,k表示询问l至r之间所有元素的k次方和。

请对每个查询输出一个答案,答案对10^9 + 7 取模。

输入格式:

第一行输入两个整数n和m,其含义如上所述。

第二行输入n个整数a[1],a[2],...a[n];

接下来m行,每行输入三个整数l,r,k表示一个查询。

输出格式:

输出m行,每行一个整数,表示查询的答案对10^9 + 7 取模的结果。

(k <= 5,对于每个k可以利用前缀和求解)

参考答案:

from itertools import accumulate
MOD = 1000000007
# 求出a的前缀和
def get_presum(a):
    sum = list(accumulate(a))
    sum = [x % MOD for x in sum]
    return sum
# 求区间a[i]...a[r]之和
def get_sum(sum,l,r):
    if l == 0:
        return sum[r]
    else:
        return (sum[r] - sum[l-1] + MOD) % MOD


n,m = map(int,input().split())
a = list(map(int,input().split()))

# 存储a数组的前缀和,a数组平方的前缀和......
sum_list = []
for i in range(1,6):
    tem_a = [x ** i for x in a]
    sum_list.append(get_presum(tem_a))

for _ in range(m):
    l,r,k = map(int,input().split())
    print(get_sum(sum_list[k - 1],l - 1,r - 1))

运行结果:

这个题本身不难,需搞懂我前面所提到的知识点。 

例题2:小郑的蓝桥平衡串

题目描述:

平衡串指的是字符串,其中包含两种不同字符,并且这两种字符的数量相等;

例如:ababab 和aababb都是平衡字符串,因为每种字符各有三个,而abaab和aaaab都不是平衡字符串,因为每种字符串的数量并不相等;

平衡串在密码学和计算机科学中有重要应用,比如可以用来构造哈希函数或者解决一些数学问题。

小郑拿到一个仅含义L和Q的字符串,他的任务就是找到最长平衡串,且满足平衡串的要求,即保证子串中L和Q数量的相等。

输入格式:

输入一行字符串,保证字符串中只有L和Q。

输出格式:

输出一个整数,为输入字符串中最长平衡串的长度。

思路:

可以将L和Q转换成数字,例如L为+1,Q为-1,问题就变为求区间和为0的最长区间,再枚举所有的区间即可。

参考答案:

from itertools import accumulate
MOD = 1000000007
# 求出a的前缀和
def get_presum(a):
    sum = list(accumulate(a))
    sum = [x % MOD for x in sum]
    return sum
# 求区间a[i]...a[r]之和
def get_sum(sum,l,r):
    if l == 0:
        return sum[r]
    else:
        return (sum[r] - sum[l-1] + MOD) % MOD
S = input()
n = len(S)
a = []
for x in S:
    if x == 'L':
        a.append(1)
    else:
        a.append(-1)
sum = get_presum(a)
ans = 0
for l in range(n):
    for r in range(l,n):
        if get_sum(sum,l,r) == 0:
            ans = max(ans,r - l + 1)
print(ans)

运行结果:

4.二维前缀和

(1) 定义:

          前缀和:对于N*M的二维列表a(下标统一从1开始),前缀和为:

(2)公式

  • 下标从1,1开始,有如下统一公式:

这个公式的证明过程和《概率论与数理统计》中“概率求和公式的推导” 是一样的。

  • 举个例子

把它转化成代码,如下:

def output(a,n):
    for i in range(1,n+1):
        print(' '.join(map(str,a[i][1:])))
n,m = map(int,input().split())
# 下标从1开始
a = [[0] * (m + 1) for i in range(n + 1)]
sum = [[0] * (m + 1) for i in range(n + 1)]
# 输入一个二维数组
for i in range(1,n + 1):
    a[i] = [0] + list(map(int,input().split()))
output(a,n)

for i in range(1,n + 1):
    for j in range(1,m + 1):
        sum[i][j] = sum[i-1][j] + sum[i][j-1] + a[i][j] - sum[i-1][j-1]
output(sum,n)

运行结果:

增加点难度 :

 (3)习题

例题1:统计子矩阵

题目描述:

给定一个N*M的矩阵A,请你统计有多少个子矩阵(最小为1*1的,最大为N*M的)满足子矩阵中所有数的和不超过给定的整数K?

输入格式:

第一行包含三个整数N,M,K;

之后N行每行包括M个整数,代表矩阵A。

输出格式:

一个整数代表答案。

对于30%的数据,N,M <= 20;

对于70%的数据,N,M <= 100;

对于100%的数据,1 <= N,M <= 500;0 <= A(ij) <= 1000;1 <= K <= 250000000。

思路:

枚举所有的子矩阵,然后利用二维前缀和求解矩阵中元素之和。

参考答案:

n, m, k = map(int,input().split())
# 下标从1开始
a = [[0] * (m + 1) for i in range(n + 1)]
sum = [[0] * (m + 1) for i in range(n + 1)]

# 输入一个二维数组
for i in range(1,n + 1):
    a[i] = [0] + list(map(int,input().split()))


# 求二维前缀和
for i in range(1,n + 1):
    for j in range(1,m + 1):
        sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + a[i][j]

def get_sum(sum,x1,y1,x2,y2):
    return sum[x2][y2] -sum[x1-1][y2] -sum[x2][y1-1] +sum[x1-1][y1-1]

ans = 0
# 枚举左上角
for x1 in range(1,n + 1):
    for y1 in range(1,m + 1):
        # 枚举右上角
        for x2 in range(x1,n + 1):
            for y2 in range(y1,m + 1):
                if get_sum(sum,x1,y1,x2,y2) <= k:
                    ans += 1
print(ans)

运行结果:

 

OK,今天就写到这里了,这个题我做了50分钟左右,心累啊。

若有疑问,可以提出,一起交流。

下次继续! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353616.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】IP协议及动态路由算法

对应代码包传送门 IP协议及动态路由算法代码包及思科模拟器资料说明 相关文章 【计算机网络】中小型校园网构建与配置 【计算机网络】Socket通信编程与传输协议分析 【计算机网络】网络应用通信基本原理 目的&#xff1a; 1、掌握IP协议&#xff0c;IP分片&#xff0c;DH…

laravel框架项目对接小程序实战经验回顾

一.对接小程序总结 1.状态转换带来的问题&#xff0c;如下 问题原因&#xff1a;由于status 传参赋值层级较多&#xff0c;导致后续查询是数组但是传参是字符串&#xff0c; 解决方案&#xff1a;互斥的地方赋值为空数组&#xff0c;有状态冲突的地方unset掉不需要的参数 2参…

循环的乐章与爱情的旋律

循环的乐章与爱情的旋律 The Rhapsody of Loops and the Melody of Love 在一个阳光明媚的Java编程课上&#xff0c;男主角林浩然&#xff0c;一个热衷于代码逻辑和算法谜题的大二学生&#xff0c;正沉浸在他的Java世界里。而女主角杨凌芸&#xff0c;则是班级中出了名的“程序…

【AI量化分析】小明在量化中使用交叉验证原理深度分析解读

进行交叉验证好处 提高模型的泛化能力&#xff1a;通过将数据集分成多个部分并使用其中的一部分数据进行模型训练&#xff0c;然后使用另一部分数据对模型进行测试&#xff0c;可以确保模型在未见过的数据上表现良好。这样可以降低模型过拟合或欠拟合的风险&#xff0c;提高模…

多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-LSTM多变量时间序列预测&#x…

【Android】实现简易购物车功能(附源码)

先上结果&#xff1a; 代码&#xff1a; 首先引入图片加载&#xff1a; implementation com.github.bumptech.glide:glide:4.15.1配置权限清单&#xff1a; <!-- 网络权限 --><uses-permission android:name"android.permission.INTERNET"/><uses…

【机器学习300问】16、逻辑回归模型实现分类的原理?

在上一篇文章中&#xff0c;我初步介绍了什么是逻辑回归模型&#xff0c;从它能解决什么问题开始介绍&#xff0c;并讲到了它长什么样子的。如果有需要的小伙伴可以回顾一下&#xff0c;链接我放在下面啦&#xff1a; 【机器学习300问】15、什么是…

【前端web入门第一天】02 HTML图片标签 超链接标签 音频标签 视频标签

文章目录: 1.HTML图片标签 1.1 图像标签-基本使用1.2 图像标签-属性1.3 路径 1.3.1 相对路径 1.3.2 绝对路径 2.超链接标签 3.音频标签 4.视频标签 1.HTML图片标签 1.1 图像标签-基本使用 作用:在网页中插入图片。 <img src"图片的URL">src用于指定图像…

Kong: Services and Routes 等基本属性

Services 在Kong Gateway中&#xff0c;服务是现有上游应用程序的抽象。服务可以存储插件配置和策略等对象的集合&#xff0c;并且可以与路由相关联。 定义服务时&#xff0c;管理员会提供名称和上游应用程序连接信息。连接详细信息可以在 url 字段中以单个字符串的形式提供…

Kotlin 教程(环境搭建)

Kotlin IntelliJ IDEA环境搭建 IntelliJ IDEA 免费的社区版下载地址&#xff1a;Download IntelliJ IDEA – The Leading Java and Kotlin IDE 下载安装后&#xff0c;我们就可以使用该工具来创建项目&#xff0c;创建过程需要选择 SDK&#xff0c; Kotlin 与 JDK 1.6 一起使…

【c语言】人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时候&#xff0c;设定初始属性&#xff1a;颜值&#xf…

新建一个基于标准库的工程(STM32)

目录 1.新建存放工程的文件夹 2.打开KEIL5软件 3.新建一个本次工程的文件夹 4.添加工程的必要文件 4.1打开STM32的启动文件 ​编辑 4.2&#xff1a; 4.3添加内核寄存器文件 ​编辑 5.回到keil5软件&#xff0c;将刚才复制的那些文件添加到工程中 5.1添加一个启动文件&am…

【服务器数据恢复】EqualLogic存储磁盘坏道导致存储不可用的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某公司IT部门一台某品牌EqualLogic PS6100系列存储在运行过程中突然崩溃。 服务器管理员对故障服务器存储进行初步检查&#xff0c;经过检测发现导致该服务器存储无法正常工作的原因是该存储中raid5磁盘阵列内有2块硬盘出现故障离线&a…

VitePress-03-标题锚点的使用与文档内部链接跳转

说明 本文介绍如下内容&#xff1a; 1、vitepress 中 md 文件中的标题锚点 2、锚点的使用 &#xff1a; 文档内部的快速跳转 锚点 什么是锚点 锚点 &#xff1a; 通俗的理解就是一个位置标记&#xff0c;通过这个标记可以快速的进行定位。 【vitepress 中&#xff0c;md 文档的…

LeetCode 40.组合总和 II

组合总和 II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 方法一、回溯 由于题目要求解集…

day23 其他事件(页面加载事件、页面滚动事件)

目录 页面加载事件页面/元素滚动事件页面滚动事件——获取位置 页面加载事件 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件为什么使用&#xff1a; 有时候需要等页面资源全部处理完毕再做一些事老代码喜欢把script写在head中&…

CentOS使用

1.使用SSH连接操作虚拟机中的CentOS 使用代理软件(MobaX/Xshell)通过ssh连接vmware中的虚拟机,可以摆脱vmware笨重的软件,直接在代理软件中进行操作. 包括使用云虚拟器,其实也只是在本地通过ssh连接别处的云服务商的硬件而已. 1.1 配置静态IP 为什么要配置静态IP? 想要使用…

【Linux 内核源码分析】多核调度分析

多核调度 SMP&#xff08;Symmetric Multiprocessing&#xff0c;对称多处理&#xff09;是一种常见的多核处理器架构。它将多个处理器集成到一个计算机系统中&#xff0c;并通过共享系统总线和内存子系统来实现处理器之间的通信。 首先&#xff0c;SMP架构将一组处理器集中在…

leetcode hot100岛屿数量

本题中要求统计岛屿数量&#xff08;数字1的上下左右均为1&#xff0c;则是连续的1&#xff0c;称为一块岛屿&#xff09;。那么这种类型题都是需要依靠深度优先搜索&#xff08;DFS&#xff09;或者广度优先搜索&#xff08;BFS&#xff09;来做的。这两种搜索&#xff0c;实际…

【开源】基于JAVA+Vue+SpringBoot的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…