学python的第二天---差分

news2024/11/24 18:51:22

  • 一、改变数组元素(差分)
    • 方法一:差分数组
      • map(int,input().split())
      • for b in arr[:n]:
      • print(1 if b else 0,end=' ')
    • 方法二:区间合并
      • interval.sort(key=lambda x:x[0])
  • 二、差分
      • a = [0] + list(map(int, input().split())) + a[n + 1:]
  • 三、差分矩阵
    • 写法一:
    • 写法二:
      • print(" ".join(map(str,dt[i][1:m+1])))
  • 四、增减序列
      • print(f"{max(pos, neg)}\n{abs(pos - neg) + 1}")

一、改变数组元素(差分)

在这里插入图片描述

方法一:差分数组

map(int,input().split())

这个返回的是一个对象,而不是一个整数

for b in arr[:n]:

arr[:n] 是 Python 中的一个切片操作,表示从列表 arr 的开头(索引0)到第 n-1 个元素的子列表。

print(1 if b else 0,end=’ ')

这段代码的作用是将布尔值 b 转换成整数并打印出来。如果 b 为 True,则打印 1,否则打印 0。代码中的 end=’ ’ 表示在打印结果后不换行,而是以空格结尾。

#只用关心某个数字位置是否被覆盖过,不关心覆盖过几次
for i in range(int(input())):#读入输入数组的次数
    n,a=int(input()),list(map(int,input().split()))#前面是传入一个数,后面传的一个数组
    arr=[0]*(n+5)#数组的大小
    for j in range(n):
        arr[max(0,j-a[j]+1)]+=1
        arr[j+1]-=1
    for j in range(1,n):
        arr[j]+=arr[j-1]#差分数组
    for b in arr[:n]:
        print(1 if b else 0,end=' ')#这个用法好绝,对于初学者来说
    print()#换行

方法二:区间合并

这段代码是一个处理区间问题的算法,主要实现以下步骤:

1.读入一个整数 n 和长度为 n 的整数列表 a。

2.对于列表 a 中的每个元素 a[j],如果它不为零,则将区间 [max(0, j-a[j]+1), j] 添加到 interval 列表中。

3.对 interval 列表按照区间的左端点进行排序。

4.对于排好序的 interval 列表中的每个区间,将该区间内的所有元素在 arr 列表中标记为 1。

5.输出标记好的 arr 列表。

可以看到,该算法的时间复杂度为 O(nlogn),其中最耗时的操作是对区间列表进行排序。

interval.sort(key=lambda x:x[0])

这段代码是按照左端点进行排序,如果要按照右端点进行排序

interval.sort(key=lambda x: x[1])

for i in range(int(input())):#input()返回为str,转换为int
    n,a=int(input()),list(map(int,input().split()))#输入数组大小及数组元素
    arr,interval=[0]*n,[]
    for j in range(n):
        if a[j]:
            interval.append([max(0,j-a[j]+1),j])#记录区间
    interval.sort(key=lambda x:x[0])#按照区间端点进行排序
    if interval:#检查interval是否为空,若为空则直接输出长度为n的全0数组,
        # 如果不为空,则按照一定的规则将1填充到arr数组中
        p=1#编号为0的区间
        for j in range(1,len(interval)):
            if interval[j][0]>interval[p-1][1]+1:#如果区间左端点大于编号为p-1的一个区间右端点+1,则说明这是两个区间
                interval[p]=interval[j]
                p+=1
            else:#如果在内部,则可以这两个区间
                interval[p-1][1]=max(interval[p-1][1],interval[j][1])
        for j in range(p):#枚举每个区间,将每个区间内所包含的置1
            for k in range(interval[j][0],interval[j][1]+1):
                arr[k]=1
    for a in arr:
        print(a,end=' ')
    print()

注意缩进!!!

二、差分

在这里插入图片描述

a = [0] + list(map(int, input().split())) + a[n + 1:]

这行代码的作用是将列表a中从下标1到n(包括1和n)的元素替换为输入的元素,并在列表的开头和结尾添加了一个0,保证了后面的操作不会出现索引错误。具体地:

a[:n+1]表示从下标0到n的元素,其中a[0]为列表的第一个元素,a[n]为列表的最后一个元素,a[n+1:]表示从下标n+1到列表结尾的所有元素。

因此,a = [0] + list(map(int, input().split())) + a[n +1:]的作用就是先将0添加到列表的开头,然后将输入的元素添加到原来的位置上,最后再将原来的n+1到结尾的所有元素添加到列表的尾部,从而得到了一个长度为n+2的新列表a。

n,q=map(int,input().split())
a=[0]*(n+10)
b=[0]*(n+10)

#a的0位是0,第1位到第n位是输入的数,第n+1位起往后都是0
a=[0]+list(map(int,input().split()))+a[n+1:]
for i in range(1,n+1):
    b[i]=a[i]-a[i-1]#初始化b数组
    
while q:
    l,r,c=map(int,input().split())
    b[l]+=c
    b[r+1]-=c
    q-=1
    
#a数组没有用了,将a更新一遍
for i in range(1,n+1):
    a[i]=a[i-1]+b[i]
    print(a[i],end=' ')

三、差分矩阵

在这里插入图片描述

写法一:

def insert(matrix,x1,y1,x2,y2,c):#差分数组
    matrix[x1][y1]+=c
    matrix[x2+1][y1]-=c
    matrix[x1][y2+1]-=c
    matrix[x2+1][y2+1]+=c

def main():
    n, m, q = map(int, input().split())
    matrix=[[0 for i in range(m+10)] for j in range(n+10)]#定义二维数组
    for i in range(1,n+1):
        row =list(map(int, input().split()))
        for j in range(m):
            insert(matrix,i,j+1,i,j+1,row[j])
            
    for i in range(q):
        x1,y1,x2,y2,c=map(int,input.split())
        insert(matrix,x1,y1,x2,y2,c)
        
    for i in range(1,n+1):
        for j in range(1,m+1):
            matrix[i][j]+=matrix[i-1][j]+matrix[i][j-1]-matrix[i-1][j-1]
            print(matrix[i][j],end=" ")
        print()

if __name__=="__main__":
    main()

写法二:

print(" ".join(map(str,dt[i][1:m+1])))

这行代码将列表dt[i][1:m+1]中的元素转换成字符串,然后用空格连接起来,并打印输出。其中:

  1. map(str, dt[i][1:m+1]) 表示将列表 dt[i][1:m+1] 中的每个元素都转换成字符串类型;
  2. " ".join(…) 表示将字符串列表中的元素用空格连接起来,形成一个新的字符串;
  3. print(…) 表示将拼接好的字符串打印输出。
def insert(b,x1,y1,x2,y2,c):
    b[x1][y1] += c
    b[x2+1][y1] -= c
    b[x1][y2+1] -= c
    b[x2+1][y2+1] += c

n,m,q = map(int,input().split())
ls = []
dt = [[0 for _ in range(1010)] for _ in range(1010)]
for i in range(n):
    ls.append(list(map(int,input().split())))
for i in range(1,n+1):
    for j in range(1,m+1):
        insert(dt,i,j,i,j,ls[i-1][j-1])
while q >0:
    q -= 1
    x1,y1,x2,y2,c = map(int,input().split())
    insert(dt,x1,y1,x2,y2,c)
for i in range(1,n+1):
    for j in range(1,m+1):
        dt[i][j] +=dt[i-1][j]+dt[i][j-1] - dt[i-1][j-1]
for i in range(1,n+1):
    print(" ".join(map(str,dt[i][1:m+1])))

四、增减序列

差分解决一段区域同时增加或减少的问题
给区间【L,R】上都加上一个常数c,则b[L] += c , b[R + 1] -=c

求出a的差分序列b,其中b1 = a1,b(i) = a(i) - a(i - 1) (2 <= i <= n)。令b(n + 1) = 0,题目对序列a的操作,相当于每次可以选出b1,b2…b(n + 1)中的任意两个数,一个加1,另外一个减一。目标是把b2,b3,…bn变为全0。最终得到的数列a就是由 n 个 b1 构成的

任选两个数的方法可分为四类
1、2 <= i , j <=n(优先)
2、i = 1, 2 <=j <=n
3、2 <= i <= n , j = n + 1
4、i = 1, j = n + 1(没有意义)

设b2,b3…bn中正数总和为p,负数总和的绝对值为q。首先以正负数匹配的方式尽量执行1类操作,可执行min(p,q)次。剩余|p - q|个为匹对,每个可以选与b1或b(n + 1)匹配,即执行2 或 3 类操作,共需|p - q|次

综上所诉,最少操作次数为min(p,q) + |p - q|。根据|p - q|次第2、3类操作的选择情况,能产生|p - q| + 1中不同的b1的值,即最终得到的序列a可能有|p - q| + 1 种

在这里插入图片描述

print(f"{max(pos, neg)}\n{abs(pos - neg) + 1}")

这是一种 f-string 的写法,用于格式化字符串。其中,大括号内的部分会被替换为相应的变量或表达式的值。具体来说:

f"xxx":表示这是一个 f-string,其中 xxx 是字符串内容,可以包含普通文本和大括号表达式。
{max(pos, neg)}:表示一个大括号表达式,会被替换为 pos 和 neg 中的最大值。
\n:表示换行符。
{abs(pos - neg) + 1}:表示一个大括号表达式,会被替换为 pos 和 neg 的差值的绝对值加上 1。

n = int(input())
a = [0] * (n + 2)
for i in range(1,n+1):
    x = int(input())
    a[i] += x
    a[i+1] -= x

pos, neg = 0, 0
for i in range(2, n+1):
    if a[i] > 0:
        pos += a[i]
    else:
        neg -= a[i]

print(f"{max(pos, neg)}\n{abs(pos - neg) + 1}")

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android从屏幕刷新到View的绘制(二)之Choreographer、Vsync与屏幕刷新

0.相关分享&#xff1a; Android从屏幕刷新到View的绘制&#xff08;一&#xff09;之 Window、WindowManager和WindowManagerService之间的关系 Android从屏幕刷新到View的绘制&#xff08;二&#xff09;之Choreographer、Vsync与屏幕刷新 1. 相关类 Choreographer 编舞者…

MySQL创建表

在创建表时需要提前了解mysql里面的数据类型 常见的数据类型 创建表方式1&#xff1a; 格式&#xff1a; CREATE TABLE [IF NOT EXISTS] 表名( 字段1, 数据类型 [约束条件] [默认值], 字段2, 数据类型 [约束条件] [默认值], 字段3, 数据类型 [约束条件] [默认值], …… [表约束…

英语基础语法学习(B站英语电力公司)

1. 句子结构 五大基本句型&#xff1a; 主谓主谓宾主谓宾宾主谓宾宾补主系表 谓语&#xff1a; 一般来说&#xff0c;谓语是指主语发出的动作。&#xff08;动词&#xff09;但是很多句子是没有动作的&#xff0c;但是还是必须要有谓语。&#xff08;此时需要be动词&#x…

echo命令

这是一条内置命令。 输出指定的字符串 一、语法 echo [选项] [参数] 二、选项 -e&#xff1a;激活转义字符。 使用-e选项时&#xff0c;若字符串中出现以下字符&#xff0c;则特别加以处理&#xff0c;而不会将它当成一般文字输出&#xff1a; \a 发出警告声&#xff1b; \b 删…

k8s-yaml文件

文章目录一、K8S支持的文件格式1、yaml和json的主要区别2、YAML语言格式二、YAML1、查看 API 资源版本标签2、编写资源配置清单2.1 编写 nginx-test.yaml 资源配置清单2.2 创建资源对象2.3 查看创建的pod资源3、创建service服务对外提供访问并测试3.1 编写nginx-svc-test.yaml文…

pytorch入门2--数据预处理、线性代数的矩阵实现、求导

数据预处理是指将原始数据读取进来使得能用机器学习的方法进行处理。 首先介绍csv文件&#xff1a; CSV 代表逗号分隔值&#xff08;comma-separated values&#xff09;&#xff0c;CSV 文件就是使用逗号分隔数据的文本文件。 一个 CSV 文件包含一行或多行数据&#xff0c;每一…

尚硅谷nginx基础

nginx1. nginx安装1.1版本区别1.2安装步骤1.3 启动nginx1.4关于防火墙1.5 安装成系统服务1.6 配置nginx环境变量2. nginx基本使用2.1 基本运行原理2.2 nginx配置文件2.2.1 最小配置2.2.1.1 基本配置说明2.3 虚拟主机2.3.1域名、dns、ip地址的关系2.3.2IP地址和DNS地址的区别2.3…

Vue2 组件基础使用、父子组件之间的传值

一、什么是组件如画红框的这些区域都是由vue里的各种组件组成、提高复用信通常一个应用会以一棵嵌套的组件树的形式来组织&#xff1a;例如&#xff0c;你可能会有页头、侧边栏、内容区等组件&#xff0c;每个组件又包含了其它的像导航链接、博文之类的组件。为了能在模板中使用…

Mybatis中添加、查询、修改、删除

在Mybatis中添加数据的操作 编写相对应的SQL语句&#xff0c;并完成相关数据的对应关系 编写测试用例 需要提交事务 sqlSession commit() 这里需要注意的是mybatis是默认的是手动提交事务&#xff0c;如果不写的话会进行回滚&#xff0c;添加操作就不会被执行 或者在 如果…

15- TensorFlow基础 (TensorFlow系列) (深度学习)

知识要点 TensorFlow是深度学习领域使用最为广泛的一个Google的开源软件库 .TensorFlow中定义的数据叫做Tensor(张量), Tensor又分为常量和变量. 常量一旦定义值不能改变. 定义常量: t tf.constant([[1., 2., 3.], [4., 5., 6.]])定义变量: v tf.Variable([[1., 2., 3.], [4…

黑盒测试用例设计方法-边界值分析法

一、边界值定义 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 长期的测试工作经验告诉我们&#xff0c;大量的错误是发生在输入或输出范围…

Vision Transformer(ViT)

1. 概述 Transformer[1]是Google在2017年提出的一种Seq2Seq结构的语言模型&#xff0c;在Transformer中首次使用Self-Atttention机制完全代替了基于RNN的模型结构&#xff0c;使得模型可以并行化训练&#xff0c;同时解决了在基于RNN模型中出现了长距离依赖问题&#xff0c;因…

TDG code

部分 数据集 参数设置 def setup_args(args None):args.algorithm_name TDG# args.algorithm_name HDGargs.user_num 1000000args.attribute_num 6args.domain_size 64args.epsilon 0.2args.dimension_query_volume 0.5args.query_num 20args.query_dimension 3运行…

leetcode 41~50 学习经历

leetcode 41~50 学习经历41. 缺失的第一个正数42. 接雨水43. 字符串相乘44. 通配符匹配45. 跳跃游戏 II46. 全排列47. 全排列 II48. 旋转图像49. 字母异位词分组50. Pow(x, n)小结41. 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的…

C语言数据结构(二)—— 受限线性表 【栈(Stack)、队列(Queue)】

在数据结构逻辑层次上细分&#xff0c;线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”&#xff0c;可以自由的删除或添加结点。受限线性表主要包括栈和队列&#xff0c;受限表示对结点的操作受限制。一般线性表详解&#xff0c;请参考文章&…

数据结构基础之栈和队列

目录​​​​​​​ 前言 1、栈 2、队列 2.1、实现队列 2.2、循环队列 前言 上一篇中我们介绍了数据结构基础中的《动态数组》&#xff0c;本篇我们继续来学习两种基本的数据结构——栈和队列。 1、栈 特点&#xff1a;栈也是一种线性结构&#xff0c;相比数组&#xff…

(汇总记录)电机控制算法

1.S曲线应用电机加减速 电机控制 | S曲线加减速 - Tuple - 博客园 (cnblogs.com) 如要将S型曲线应用到电机的加减速控制上&#xff0c;需要将方程在X、Y坐标系进行平移&#xff0c;同时对曲线进行拉升变化&#xff1a;即 Y A B / ( 1 exp( -ax b ) ) &#xff0c;则根据该…

Pandas怎么添加数据列删除列

Pandas怎么添加数据列 1、直接赋值 # 1、直接赋值df.loc[:, "最高气温"] df["最高气温"].str.replace("℃", "").astype("int32")df.loc[:, "最低气温"] df["最低气温"].str.replace("℃"…

Java异常架构与异常关键字

Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离&#xff0c;保证程序代码更加优雅&#xff0c;并提高程序健壮性。在有效使用异常的情况下&#xff0c;异常能清晰的回答what, where, why这3个问…

【编程入门】N种编程语言做个应用市场(appstore)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 本系列做了个应用市场&#xff0c;支持下载安装安卓…