第十四届蓝桥杯Python B组省赛复盘

news2024/11/24 16:32:15

第十四届蓝桥杯Python B组省赛复盘

文章目录

  • 第十四届蓝桥杯Python B组省赛复盘
    • 试题 A: 2023
      • 【问题描述】(5 分)
      • 【思路】
    • 试题 B: 硬币兑换
      • 【问题描述】
      • 【思路】
    • 试题 C: 松散子序列
      • 【问题描述】
      • 【输入格式】
      • 【输出格式】
      • 【样例输入】
      • 【样例输出】
      • 【评测用例规模与约定】
      • 思路
    • 试题 D: 管道
      • 【问题描述】
      • 【输入格式】
      • 【输出格式】
      • 【样例输入】
      • 【样例输出】
      • 【评测用例规模与约定】
      • 思路
    • 试题 E: 保险箱
      • 【问题描述】
      • 【输入格式】
      • 【输出格式】
      • 【样例输入】
      • 【样例输出】
      • 【评测用例规模与约定】
      • 思路

试题 A: 2023

【问题描述】(5 分)

请求出在 12345678 至 98765432 中,有多少个数中完全不包含 2023 。

完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 。

例如 20322175,33220022 都完全不包含 2023,而 20230415,20193213 则 含有 2023 (后者取第 1, 2, 6, 8 个数位) 。

【思路】

  1. 正则表达式

    '''
    正则表达式
    '''
    import re
    
    def check(s) :
        if re.match(r'.*2.*0.*2.*3.*', s) :
            return False
        else : return True
    
    st = 12345678
    ed = 98765432
    res = 0
    while st <= ed :
        if check(str(st)) :
            res += 1
        st += 1
    print(res)
    
  2. 信号量机制(哨兵)
    从后往前,s1,s2,s3,s4分别标记3,2,0,2是否已经找到。大致思路是只有前面的数全找到后才能找下一个数。比如当找0时,必须确保从后往前已经找到了3,2这个两个数。

    def check(n) :
        s1, s2, s3, s4 = False, False, False, False
        for i in range(8) :
            if n % 10 == 3 and not s1 :
                s1 = True
            elif n % 10 == 2 and s1 and not s2 :
                s2 = True
            elif n % 10 == 0 and s1 and s2 and not s3:
                s3 = True
            elif n % 10 == 2 and s1 and s2 and  s3 and not s4:
                s4 =True
            n //= 10
        return not (s1 and s2 and s3 and s4)
      
    st = 12345678
    ed = 98765432
    res = 0
    while st <= ed :
        if check(str(st)) :
            res += 1
        st += 1
    print(res)
    

试题 B: 硬币兑换

【问题描述】

小蓝手中有 2023 种不同面值的硬币,这些硬币全部是新版硬币,其中第 i ( 1 ≤ i ≤ 2023 ) i(1 ≤ i ≤ 2023) i(1i2023) 种硬币的面值为 i i i ,数量也为 i i i 个。硬币兑换机可以进行硬币兑换,兑换规则为:交给硬币兑换机两个新版硬币 c o i n 1 coin_1 coin1 c o i n 2 coin_2 coin2 ,硬币兑换机会兑换成一个面值为 c o i n 1 + c o i n 2 coin_1 + coin_2 coin1+coin2 的旧版硬币。小蓝可以用自己已有的硬币进行任意次数兑换,假设最终小蓝手中有 K K K 种不同面值的硬币(只看面值,不看新旧)并且第 i ( 1 ≤ i ≤ K ) i(1 ≤ i ≤ K) i(1iK) 种硬币的个数为 s u m i sum_i sumi。小蓝想要使得 m a x { s u m 1 , s u m 2 , ⋅ ⋅ ⋅ , s u m K } max\{sum_1, sum_2, · · · , sum_K\} max{sum1,sum2,⋅⋅⋅,sumK} 的值达到最大,请你帮他计算这个值最大是多少。
注意硬币兑换机只接受新版硬币进行兑换,并且兑换出的硬币全部是旧版硬币。

【思路】

我们知道硬币的数量是随着面值单调增加,那么两个面值要拼凑出一个大的面值,取决于小的面值。
假设有n中面值硬币, a n − 1 , a n a_{n - 1}, a_n an1,an分别表示尽可能拼凑出最多个面额分别为 n − 1 , n n - 1,n n1,n的硬币。
a n − 1 = n − 1 + 1 + . . . + i n t ( n − 1 / 2 ) a_{n - 1} = n - 1 + 1+ ...+int(n - 1 / 2) an1=n1+1+...+int(n1/2)
a n = n + 1 + . . . + n / 2 a_n = n + 1 + ... + n/2 an=n+1+...+n/2
显然 a n a_n an更大。所以最终拼凑出的数是大于等于 a n a_n an

res = 0
for t in range(2023, 4047) :
    ans = 0
    for i in range(1, 2024) :
        ta = t - i
        if i == ta :
            ans += (i // 2)
        if ta <= i or ta > 2023 :
            continue
        ans += i

    if t == 2023 :
        ans += 2023
    res = max(res, ans)
print(res)
'''
682425
'''

试题 C: 松散子序列

时间限制: 10.0s 内存限制: 512.0MB 本题总分:10 分

【问题描述】

给定一个仅含小写字母的字符串 s ,假设 s 的一个子序列 t 的第 i 个字符
对应了原字符串中的第 pi 个字符。我们定义 s 的一个松散子序列为:对于 i > 1
总是有 p i − p i − 1 ≥ 2 p_i − p_{i−1} ≥ 2 pipi12 。设一个子序列的价值为其包含的每个字符的价值之和 (
a ∼ z 分别为 1 ∼ 26 ) 。
求 s 的松散子序列中的最大价值。

【输入格式】

输入一行包含一个字符串 s 。

【输出格式】

输出一行包含一个整数表示答案。

【样例输入】

azaazaz

【样例输出】

78

【评测用例规模与约定】

在这里插入图片描述

思路

本题大概意旨是,不能选连续两个字符组成的序列,典型的打家劫舍板子

  1. 状态机

    • 状态表示 f [ i , 0 / 1 ] f[i, 0/1] f[i,0/1]
      • 集合:表示0~i的字符串(不0)选取1第i个字符的松散序列价值的集合
      • 属性:max
    • 状态计算: f [ i , 0 ] = m a x ( f [ i − 1 , 0 ] , f [ i − 1 , 1 ] ) f[i, 0] = max(f[i - 1, 0], f[i - 1, 1]) f[i,0]=max(f[i1,0],f[i1,1]), f [ i , 1 ] = f [ i − 1 , 0 ] + s [ i ] f[i, 1] =f[i - 1, 0] + s[i] f[i,1]=f[i1,0]+s[i]
    s = list(input())
    n = len(s)
    for i in range(n) :
    	s[i] = ord(s[i]) - ord('a') + 1
    f = [[0, 0] for _ in range(n + 1)]
    for i in range(1, n + 1) :
    	f[i][0] = max(f[i - 1][0], f[i - 1][1])
    	f[i][1] = f[i - 1][0] + s[i - 1]
    print(max(f[n][0], f[n][1]))
    
  2. 线性DP

    • 状态表示 f [ i ] f[i] f[i]
      • 集合:表示以i字符结尾的松散序列价值的集合
      • 属性:max
    • 状态计算: f [ i ] = m a x ( f [ j ] ) + o r d ( s [ i ] ) , j < = i − 2 f[i] = max(f[j]) + ord(s[i]),j <=i-2 f[i]=max(f[j])+ord(s[i]),j<=i2
    '''
    状态表示:f[i]
        集合:表示以i结尾的满足条件的子序列的价值集合
        属性:max
    状态计算:f[i] = max(f[j]) + ord(s[i]),j <=i-2
    '''
    
    s = list(input())
    n = len(s)
    
    f = [0] * (n + 2)
    
    maxx = 0 # 记录到i-2的最大值
    for i in range(1, n + 1) :
        f[i] = maxx + ord(s[i - 1]) - ord('a') + 1
        maxx = max(f[i - 1], maxx)
    print(max(maxx, f[n]))
    

试题 D: 管道

时间限制: 10.0s 内存限制: 512.0MB 本题总分:10 分

【问题描述】

有一根长度为 len 的横向的管道,该管道按照单位长度分为 len 段,每一段
的中央有一个可开关的阀门和一个检测水流的传感器。
一开始管道是空的,位于 L i L_i Li 的阀门会在 S i S_i Si 时刻打开,并不断让水流入管
道。
对于位于 L i L_i Li 的阀门,它流入的水在 T i ( T i ≥ S i ) T_i (T_i ≥ S_i) Ti(TiSi) 时刻会使得从第 L i − ( T i − S i ) L_i−(T_i−S_i) Li(TiSi)
段到第 L i + ( T i − S i ) L_i + (T_i − S_i) Li+(TiSi) 段的传感器检测到水流。
求管道中每一段中间的传感器都检测到有水流的最早时间。

【输入格式】

输入的第一行包含两个整数 n, len,用一个空格分隔,分别表示会打开的阀
门数和管道长度。
接下来 n 行每行包含两个整数 L i , S i L_i, S_i Li,Si,用一个空格分隔,表示位于第 L i L_i Li
管道中央的阀门会在 S i S_i Si 时刻打开。

【输出格式】

输出一行包含一个整数表示答案。

【样例输入】

3 10
1 1
6 5
10 2

【样例输出】

5

【评测用例规模与约定】

在这里插入图片描述

思路

要求检测到水流的最短时间,看到len的数据范围是 1 0 9 10^9 109应该用一个低于 O ( n ) O(n) O(n)的算法。
这就让我们想到了二分。通过二分右半段,可以查找满足全部覆盖的最短时间。
对于确定的时刻 t t t,一个在 s s s时刻 ( t > = s ) (t >= s) (t>=s)打开并位于 l l l的管道,在此时此刻可以覆盖的区间是 [ m a x ( l − ( t − s ) , 1 ) , m i n ( l + ( t − s ) , l e n ) ] [max(l - (t - s), 1), min(l + (t - s), len)] [max(l(ts),1),min(l+(ts),len)].
下面考虑区间覆盖问题,对于n个区间,可以一个个枚举区间,并对覆盖区间进行标记,然而这样的复杂度是 O ( n l e n ) O(nlen) O(nlen)。怎么优化呢?我们想到对区间进行操作的一个基础算法差分,类似于LeetCode中的区间覆盖原题。

'''
覆盖问题,二分
'''
from sys import stdin

def check(x) :
    st = [0] * (m + 2)
    for item in a :
        if item[1] <= x :
            l, r = max(item[0] - (x - item[1]), 1), min(item[0] + (x - item[1]), m)
            st[l] += 1
            st[r + 1] -= 1
    for i in range(1, m + 1) :
        st[i] += st[i - 1]
        if st[i] <= 0 :
            return False
    return True
                

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

a = []

for _ in range(n) :
    l, s = map(int, stdin.readline().split())
    a.append([l, s])

l, r = 0, m + 1
while l < r :
    mid = (l + r) >> 1
    if check(mid) :
        r = mid
    else :
        l = mid + 1
print(l)

试题 E: 保险箱

时间限制: 10.0s 内存限制: 512.0MB 本题总分:15 分

【问题描述】

小蓝有一个保险箱,保险箱上共有 n 位数字。
小蓝可以任意调整保险箱上的每个数字,每一次操作可以将其中一位增加
1 或减少 1 。
当某位原本为 9 或 0 时可能会向前(左边)进位/退位,当最高位(左边第
一位)上的数字变化时向前的进位或退位忽略。
例如:
00000 的第 5 位减 1 变为 99999 ;
99999 的第 5 位减 1 变为 99998 ;
00000 的第 4 位减 1 变为 99990 ;
97993 的第 4 位加 1 变为 98003 ;
99909 的第 3 位加 1 变为 00009 。
保险箱上一开始有一个数字 x,小蓝希望把它变成 y,这样才能打开它,问
小蓝最少需要操作的次数。

【输入格式】

输入的第一行包含一个整数 n 。
第二行包含一个 n 位整数 x 。
第三行包含一个 n 位整数 y 。

【输出格式】

输出一行包含一个整数表示答案。

【样例输入】

5
12349
54321

【样例输出】

11

【评测用例规模与约定】

在这里插入图片描述

思路

比赛的时候看到这题秒想用BFS,但本题的数据范围实在太大,即使跑10s超过10长度的数据也跑不出来。这时我问了ChatGPT,它如是说

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

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

相关文章

Python | 人脸识别系统 — 活体检测

本博客为人脸识别系统的活体检测代码解释 人脸识别系统博客汇总&#xff1a;人脸识别系统-博客索引 项目GitHub地址&#xff1a; 注意&#xff1a;阅读本博客前请先参考以下博客 工具安装、环境配置&#xff1a;人脸识别系统-简介 UI界面设计&#xff1a;人脸识别系统-UI界面设…

6---N字形变化

将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输出需要从左往右逐…

JavaScrpit—数据类型转换

目录 1、起 源 理 念 2、特 点 框 架 AngularJS框架 WebSocket协议 3、书 写 位 置 注 释 浏览器调试js代码 4、变量作用 全局变量 局部变量 常量 5、数据类型 数 组 严格检查数据类型 字符串 6、类型转换 字符串转数字 转bool值 能力判断 7、编码方式 …

Spring IOC相关注解运用——上篇

目录 前言 一、Component 二、Repository、Service、Controller 三、Scope 四、Autowired 五、Qualifier 六、Value 1. 直接设置固定的属性值 2. 获取配置文件中的属性值 3. 测试结果 往期专栏&文章相关导读 1. Maven系列专栏文章 2. Mybatis系列专栏文章 3.…

记录一次Linux下ChatGLM部署过程

前言 本地化的GPT就是香&#xff0c;就是有点费钱。 项目地址&#xff1a;https://github.com/THUDM/ChatGLM-6B 前期准备 服务器&#xff08;本机的跳过&#xff09; 由于本地电脑显卡都不行&#xff0c;所以我租了AutoDL的一台算力服务器。Tesla T4 16G显存&#xff0c;…

自供电-测力刀柄资料整理

自供电-测力刀柄资料整理 2. 相关专利2.1 实时测量铣削过程中床主轴温度装置【1】2.2 一种基于应变片的测力系统【2】 3. 相关商业化产品3.1 spike 测力刀柄【3】3.2 瑞士奇石乐&#xff08;Kistler&#xff09;旋转切削测力仪【4】3.3 kistler的通用型压电式切削力测量系统3.4…

SPSS如何进行聚类分析之案例实训?

文章目录 0.引言1.快速聚类分析2.分层聚类分析3.两阶段聚类分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对聚类分析进行阐述。…

【软考高项笔记】第1章 信息化发展1.5 数字化转型与元宇宙

1.5 数字化转型与元宇宙 元宇宙本质上是对现实世界的虚拟化、数字化过程&#xff0c;需要对内容生产、经济系统、用户体验以及实体世界内容等进行大量改造1.5.1 数字化转型 新建一个富有活力的数字化商业模式 组织对业务进行彻底重新定义&#xff08;大洗牌&#xff09;之后才…

浅谈明日方舟游戏系统

主要玩法&#xff1a;敌方阵营从敌方初始点进入战斗并且沿着怪物前进路线行驶到己方保护目标。玩家可以通过部署干员守护己方保护目标&#xff0c;防止敌方阵营进入&#xff1b;当保护目标的生命值为0时&#xff0c;则战斗失败&#xff0c;任务结束。 1 干员系统 1.1 职业分支…

linux(stat-readdir-dup2)04-虚拟地址空间,stat函数,文件,目录,errno说明,dup2和dup

01 学习目标 1.掌握stat/lstat函数的使用 2.了解文件属性相关的函数使用 3.了解目录操作相关的函数的使用 4.掌握目录遍历相关函数的使用 5.掌握dup,dup2函数的使用 6.掌握fcntl函数的使用 02 虚拟地址空间 03 打开最大文件数量 openmax.c #include<stdio.h> #include&…

Redo log详解

WAL&#xff08;Write-Ahead Logging&#xff09;机制 WAL 的全称是 Write-Ahead Logging&#xff0c;中文称预写式日志(日志先行)&#xff0c;是一种数据安全写入机制。就是先写日志&#xff0c;然后再写入磁盘&#xff0c;这样既能提高性能又可以保证数据的安全性。Mysql中的…

华为MPLS跨域C2方式RR场景(数据不经过RR)实验配置

目录 配置BGP邻居的建立 配置MPLS LDP 配置RR之间的MP-BGP邻居 配置通过ASBR学习PE路由并为PE分配标签&#xff08;实现Vpnv4路由传递和数据传输&#xff09; 根据图配置接口的IP地址和IGP协议 配置BGP邻居的建立 PE1和RR1建立MP-IBGP邻居&#xff08;RR1传给PE1的Vpnv4路…

进程/线程 状态模型详解

前言&#xff1a;最近操作系统复习到线程的状态模型&#xff08;也可以说进程的状态模型&#xff0c;本文直接用线程来说&#xff09;时候&#xff0c;网上查阅资料&#xff0c;发现很多文章都说的很不一样&#xff0c;有五状态模型、六状态模型、七状态模型.......虽然都是对的…

【1024杯】web

文章目录 1024_fastapi信息收集SSTI 1024_柏拉图信息收集phar反序列化 1024_WEB签到1024_图片代理信息收集gopherus|fastcgi 1024_hello_world信息收集ssti盲注 1024_fastapi 信息收集 FastAPI 是一个高性能 Web 框架&#xff0c;用于构建 API。 主要特性&#xff1a; 快速&am…

【头歌】完整汇编语言程序设计

摘自头歌实训​​​​​​ 目录 相关知识 1.1 RISC-V 汇编语言程序基本结构 1.2 RISC-V 汇编语言程序主要元素 1.2.1 汇编指令 1.2.2 标签 1.2.3 汇编指示语句 1.3 RISC-V 汇编语言程序示例 相关知识 RISC-V 操作数类型、基本调用约定等已在前序关卡中介绍&#xff0c;…

云渲染是您3D项目的最佳选择吗?

市面上很多优秀的大型动画电影&#xff0c;一般都是由实力较大的视觉特效团队制作的&#xff0c;而且大部分使用的是基于云的渲染服务来进行最终渲染。像《哪吒之魔童降世》这样 IMAX 3D 首部国产动画电影、并且刷新了中国动画电影票房纪录的作品&#xff0c;就是现代3D动画提供…

ChatGPT做PPT方案,10组提示词方案!

今天我们要搞定的PPT内容是&#xff1a; 活动类型&#xff1a;节日活动、会员活动、新品活动分析类型&#xff1a;用户分析、新品立项、项目汇报内容类型&#xff1a;内容规划、品牌策划 用到的工具&#xff1a; mindshow 邀请码 6509097ChatGPT传送门&#xff08;免费使用…

《Linux0.11源码解读》理解(二) 加载setup、加载system

现在CPU开始执行bootsect&#xff0c;它的作用是把第二部分、第三部分程序陆续加载到内存中。把放到合理的内存位置需要先对内存进行规划。 根据上一节&#xff0c;boostsect当前所在内存位置是0x07c0&#xff0c;大小为512byte&#xff0c;现在要将其挪动到内存的0x9000&…

无代码时代来了,程序员会失业吗?不,程序员又不够用了!

有人问我无代码时代来了&#xff0c;程序员会失业吗&#xff1f;太难了&#xff0c;秃了头就算了&#xff0c;连工作也保不住了&#xff1f; 先说观点&#xff1a;并不会 因为&#xff0c;无代码不是真正意义上的无代码。 无代码开发的使用对象是编程小白&#xff08;我猿是…

Redis的命令以及数据类型

1.Redis的通用命令 KEYS&#xff1a;查看符合模板的所有key&#xff0c;不建议在生产环境设备上使用 DEL&#xff1a;删除一个指定的key EXISTS&#xff1a;判断key是否存在 TTL&#xff1a;查看一个KEY的剩余有效期 2.String类型 String类型&#xff0c;也就是字符串类型…