第十三届蓝桥杯省赛 python B组复盘

文章目录

  • 前言
  • 主要内容
    • 🦞试题 A:排列字母
      • 思路
      • 代码
    • 🦞试题 B:寻找整数
      • 思路
      • 代码
    • 🦞试题 C:纸张尺寸
      • 思路
      • 代码
    • 🦞试题 D:数位排序
      • 思路
      • 代码
    • 🦞试题 E:蜂巢
      • 思路
      • 代码
    • 🦞试题 F:消除游戏
      • 思路
      • 代码
    • 🦞试题 G:全排列的价值
      • 思路
      • 代码
    • 🦞试题 H:技能升级
      • 思路
      • 代码
    • 🦞试题 I:最长不下降子序列
      • 思路
      • 代码
    • 🦞试题 J:最优清零方案
      • 思路
      • 代码
  • 总结
  • 更多宝藏


前言

😎🥳😎
备战蓝桥杯第一弹–复盘
在这里插入图片描述


主要内容

🦞试题 A:排列字母

在这里插入图片描述

思路

(当时第一次参加蓝桥杯,当时现场心里小鹿乱撞,用排序输出了还每个字母数数验证一番(滑稽))

  • 字符串转列表
  • 列表排序
  • 列表转字符串

代码

l = "WHERETHEREISAWILLTHEREISAWAY"
print(''.join(sorted(l))) 
# AAAEEEEEEHHHIIILLRRRSSTTWWWY

🦞试题 B:寻找整数

在这里插入图片描述

思路

当时在现场程序没跑出来
想着那个数取余2余1,取余4余1,取余8余1可以只看取余8余1的,因为满足后者一定满足前者,而满足前者不一定满足后者,不过当时没有想到找等差数列,一直在等最后的结果。。。

之后看大神的是有三个步骤:
暴力三步走:
1.枚举数据找规律:取表后面5个大数判断更容易找到大数据,得到关键数据。
2.找出规律求公式:这些数字是按判断求得的,所以一定存在公式。
3.遍历公式找答案:通过公式进行快速遍历,30s轻松找到十六位数的答案。

代码

#1.枚举数据找规律
i=1
while True:
    flag=True
    if i%49!=46:
        flag=False
    if i%48!=41:
        flag=False
    if i%47!=5:
        flag=False
    if i%46!=15:
        flag=False
    if i%45!=29:
        flag=False
    if flag:
        print(i)
    i+=1
'''
4772009
42909689
81047369
119185049
157322729
···
'''
#2.找出规律求公式
a=[4772009, 42909689, 81047369, 119185049,157322729]
#发现存在等差数列
print(a[1]-a[0])#38137680
print(a[2]-a[1])#38137680
print(a[3]-a[2])#38137680
k=38137680
b=4772009
#求出公式
y=k
#遍历公式
x=0
k=38137680
b=4772009
while True:
    flag=True
    y=k*x+b
    for i,j in mod:
        if y%i !=j:
            flag=False
            break
    if flag==True:
        print(y)#2022040920220409
        break
    x+=1

🦞试题 C:纸张尺寸

题目描述
在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸,依此类推。
输入纸张的名称,请输出纸张的大小。
输入
输入一行包含一个字符串表示纸张的名称,该名称一定是 A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。
输出
输出两行,每行包含一个整数,依次表示长边和短边的长度。
样例输入
A0
1
样例输出
1189
841

思路

当时就想着简单的判断循环
操作是折叠纸张
A几就是折叠几次,对应循环操作了几次

  • 获取输入
  • 循环次数
  • 循环的操作
  • 输出

代码

s = input() 

t = int(s[-1]) # 最后一个数字也就是迭代的次数
w,h = 1189,841

for i in range(t):
    if w > h:
        w = w//2
    else:
        h = h//2
if w > h:
    print(w)
    print(h)
else:
    print(h)
    print(w)

🦞试题 D:数位排序

小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?
输入
输入第一行包含一个正整数 n。
第二行包含一个正整数 m。
输出
输出一行包含一个整数,表示答案。
样例输入
13
5
样例输出
3
提示
1 到 13 的排序为:1, 10, 2, 11, 3, 12, 4, 13, 5, 6, 7, 8, 9。第 5 个数为 3。
对于 30% 的评测用例,1 ≤ m ≤ n ≤ 300
对于 50% 的评测用例,1 ≤ m ≤ n ≤ 1000
对于所有评测用例,1 ≤ m ≤ n ≤ 106

思路

当时现场用的方法很绕写出来的,后来发现只是重新定义了一下排序规则

  • 计算数位之和
  • 定义排序规则

代码

n = int(input())
m = int(input())
l = [i for i in range(1,n+1)]
# 设置一个排序规则,计算数位之和
def fun(x):
    ans = 0
    while x:
        ans += x%10
        x = x//10
    return ans 

l.sort(key = fun)
print(l[m-1])

🦞试题 E:蜂巢

题目描述
蜂巢由大量的六边形拼接而成,定义蜂巢中的方向为:0 表示正西方向,1 表示西偏北 60◦,2 表示东偏北 60◦,3 表示正东,4 表示东偏南 60◦,5 表示西偏南 60◦。
对于给定的一点 O,我们以 O 为原点定义坐标系,如果一个点 A 由 O 点先向 d 方向走 p 步再向 (d + 2) mod 6 方向(d 的顺时针 120◦ 方向)走 q 步到达,则这个点的坐标定义为 (d, p, q)。在蜂窝中,一个点的坐标可能有多种。
下图给出了点 B(0, 5, 3) 和点 C(2, 3, 2) 的示意。
在这里插入图片描述

给定点 (d1, p1, q1) 和点 (d2, p2, q2),请问他们之间最少走多少步可以到达?
输入
输入一行包含 6 个整数 d1, p1, q1, d2, p2, q2 表示两个点的坐标,相邻两个整数之间使用一个空格分隔。
输出
输出一行包含一个整数表示两点之间最少走多少步可以到达。
样例输入
0 5 3 2 3 2
样例输出
7
提示
对于 25% 的评测用例,p1, p2 ≤ 103
对于 50% 的评测用例,p1, p2 ≤105
对于 75% 的评测用例,p1, p2 ≤107
对于所有评测用例,0 ≤ d1, d2 ≤ 5,0 ≤ q1 < p1 ≤ 109 ,0 ≤ q2 < p2 ≤ 109

思路

比赛的时候没有做出来,当时也是入门算法,读完题毫无思路,感慨万千

现在看了网上的回答用向量来做,将坐标的表达方式转化为向量,统一为0和1方向的向量。一共有六个方向,也就是六种计算方式。

代码

d1,p1,q1,d2,p2,q2=map(int,input().split())

# 全部转化为0 方向 和 1方向的向量
def change(d,p,q):
    if d==0:return (p-q,q)
    if d==1:return (-q,p)
    if d==2:return (-p,p-q)
    if d==3:return (q-p,-q)
    if d==4:return (q,-p)
    if d==5:return (p,q-p)
s1=change(d1,p1,q1)
s2=change(d2,p2,q2)

# 向量的减法
s=[s1[0]-s2[0],s1[1]-s2[1]]
a,b=s[0],s[1]
if a*b > 0: 
    # ab同号
    print(abs(a+b))
else: 
    # ab异号
  	print(max(abs(a),abs(b)))

🦞试题 F:消除游戏

题目描述

输入
输入一行包含一个字符串 S 。
输出
输出一行包含一个字符串表示答案,如果结果为空则输出 EMPTY。
样例输入
edda
样例输出
EMPTY
样例输入
sdfhhhhcvhhxcxnnnnshh
样例输出
s
提示
对于 25% 的评测用例,|S | ≤ 103 ,其中 |S | 表示 S 的长度;
对于 50% 的评测用例,|S | ≤ 104
对于 75% 的评测用例,|S | ≤ 105
对于所有评测用例,|S | ≤ 106 ,S 中仅含小写字母。

思路

当时读完题感觉264非常大,直接写了一个无限循环,一直循环听说只可以过75%的数据

代码

s = input()
def f(x):
    s = set()
    for i in range(1,len(x)-1):
        if (x[i] == x[i-1] and x[i] != x[i+1]):
            s.add(i)
            s.add(i+1)
        elif (x[i] != x[i-1] and x[i] == x[i+1]):
            s.add(i-1)
            s.add(i) 
    sr = ''
    for i in range(len(x)):
        if i not in s:
            sr += x[i]
    return sr
import copy
# 2的64次方操作
for i in range(1<<64):
    pre = copy.copy(s)
    s = f(s)
    if s == '':
        print('EMPTY')
        break
    elif pre == s:
        print(s)
        break

🦞试题 G:全排列的价值

在这里插入图片描述

输入
输入一行包含一个整数 n 。
输出
输出一行包含一个整数表示答案,由于所有排列的价值之和可能很大,请输出这个数除以 998244353 的余数。
样例输入
3
样例输出
9
提示
1 至 3 构成的所有排列的价值如下:
(1, 2, 3) : 0 + 1 + 2 = 3
(1, 3, 2) : 0 + 1 + 1 = 2
(2, 1, 3) : 0 + 0 + 2 = 2
(2, 3, 1) : 0 + 1 + 0 = 1
(3, 1, 2) : 0 + 0 + 1 = 1
(3, 2, 1) : 0 + 0 + 0 = 0
故总和为 3 + 2 + 2 + 1 + 1 = 9
对于 40% 的评测用例,n ≤ 20
对于 70% 的评测用例,n ≤ 5000
对于所有评测用例,2 ≤ n ≤ 106

思路

当时在在考场上猜到是动态规划,一直在找规律,也不知道找对没
看大佬们的解法,太感人了,太优雅了
在这里插入图片描述

代码

MOD = 998244353
n = int(input().strip())
dp = 0
f = 1
for i in range(2,n+1):
    dp = (dp*i+f*i*(i-1)//2)%MOD
    f = f*i%MOD
print(dp)

🦞试题 H:技能升级

在这里插入图片描述

样例输入
3 6
10 5
9 2
8 1
样例输出
47
提示
对于 40% 的评测用例,1 ≤ N, M ≤ 1000;
对于 60% 的评测用例,1 ≤ N ≤ 104 , 1 ≤ M ≤ 107;
对于所有评测用例,1 ≤ N ≤ 105,1 ≤ M ≤ 2 × 109,1 ≤ Ai , Bi ≤ 106。

思路

考场上用的是暴力,这里我们来看看大佬的思路

首先来说,我先自己做了一下,然后想到一个根据优先队列的做法,我只需要每次取得最优的,那我从某种意义来说,我们最后的结果就是最优的。

所以构建一个最大堆,然后每次取到最大的数,然后再push一个数进去,就是我们会更新我们的数,不过我们这个堆,一直都只有n个数据,我们把最大的pop出来以后,我们就可以进行更新,比如说减去b,或者变成0后不再进行技能升级。

所以依靠这样的想法,我就写了一下,而且我们在想,这样子,我们的读入数据是O(n),处理数据加上一个堆的排序,可能是nlogn,这样子应该是可以的。

这里提一下,我觉得最小堆和最大堆他是可以互换的,由于我好想发现heapq的最大堆没有push操作,那我就把数变成负的,这样我就利用最小堆构建了一个最大堆,因为加了一个负号后,最大的就变成最小的了

代码

import heapq

n,m = map(int,input().split())
a,b = [],[]

heap = []
for i in range(n):
    x,y = map(int,input().split())
    a.append(x)
    b.append(y)
    heapq.heappush(heap,(-x,i,0))

cnt = 0
import math
for i in range(m):
    x,y,z = heapq.heappop(heap)
    if x == 0:
        break
    x=-x
    cnt += x
    # x,y = nlargest(1,heap)
    if z > math.ceil(a[y]/b[y]):  
        x = 0
        continue
    else:
        x = x - b[y]
    heapq.heappush(heap,(-x,y,z+1))
    
print(cnt)

🦞试题 I:最长不下降子序列

在这里插入图片描述

样例输入
5 1
1 4 2 8 5
样例输出
4
提示
对于 20% 的评测用例,1 ≤ K ≤ N ≤ 100;
对于 30% 的评测用例,1 ≤ K ≤ N ≤ 1000;
对于 50% 的评测用例,1 ≤ K ≤ N ≤ 10000;
对于所有评测用例,1 ≤ K ≤ N ≤ 105,1 ≤ Ai ≤ 106

思路

看看大佬怎末说

代码


🦞试题 J:最优清零方案

题目描述
给定一个长度为 N 的数列 A1, A2, · · · , AN。现在小蓝想通过若干次操作将这个数列中每个数字清零。
每次操作小蓝可以选择以下两种之一:
选择一个大于 0 的整数,将它减去 1;
选择连续 K 个大于 0 的整数,将它们各减去 1。
小蓝最少经过几次操作可以将整个数列清零?
输入
输入第一行包含两个整数 N 和 K。
第二行包含 N 个整数 A1, A2, · · · , AN。
输出
输出一个整数表示答案。
样例输入复制
4 2
1 2 3 4
样例输出复制
6
提示
对于 20% 的评测用例,1 ≤ K ≤ N ≤ 10。
对于 40% 的评测用例,1 ≤ K ≤ N ≤ 100。
对于 50% 的评测用例,1 ≤ K ≤ N ≤ 1000。
对于 60% 的评测用例,1 ≤ K ≤ N ≤ 10000。
对于 70% 的评测用例,1 ≤ K ≤ N ≤ 100000。
对于所有评测用例,1 ≤ K ≤ N ≤ 1000000, 0 ≤ Ai ≤ 1000000。

思路

代码


总结

🐋 🐬 🐶 🐳 🐰 🦀☝️ ⭐ 👉 👀

如果你对这篇文章感兴趣,欢迎在评论区留言,分享你的想法和建议。如果你喜欢我的博客,请记得点赞、收藏和关注我,我会持续更新更多有用的网页技巧和教程。谢谢大家!


更多宝藏

🍇🍉🍊🍏🍋🍅🥝🥥🫒🫕🥗
项目仓库看这里🤗:
https://github.com/w-x-x-w
https://gitee.com/w-_-x
博客文章看这里🤭:
https://blog.csdn.net/weixin_62650212
视频推送看这里🤤:
https://space.bilibili.com/1909782963

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

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

相关文章

打印菱形、三角形-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-10】打印菱形、三角形 一、案例描述 考核知识点 for双重循环 练习目标 掌握for循环应用。打印出菱形打印出三角形。 需求分析 在本案例中我们将用JavaScript代码在页面中用“*”打印出菱形和三角形。 案例分析 菱形效果如图2-16所示。输入菱形行数6打印菱形 三角形…

计及光伏波动性的主动配电网有功无功协调优化(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

JVM知识整理

JVM知识整理 JVM的主要组成部分 JVM包含两个两个子系统&#xff08;类加载子系统和执行引擎&#xff09;和两个组件&#xff08;运行时数据区与和本地库接口&#xff09; 类加载子系统&#xff1a;根据给定的全限定类名来加载class文件到运行时数据区域中的方法区。执行引擎&a…

学大数据算跟风吗?

随着互联网、物联网和人工智能等技术的不断发展&#xff0c;大数据技术逐渐进入人们的视野&#xff0c;成为一个备受关注的热点话题。那么&#xff0c;大数据专业好学吗&#xff1f;前景如何&#xff1f;下面我们来一起探讨一下。 一、大数据专业的学习难度 大数据技术是一种综…

将 XLS 转换为 EXE:xlCompiler Crack

只需单击几下即可将Excel文件转换为应用程序 xl编译器无需编程即可将您的Excel电子表格转换为软件应用程序 将 XLS 转换为 EXE 将Excel文件转换为具有保护选项的应用程序。Excel 到 EXE 转换器为您提供了分发 Excel 模型的竞争优势和灵活性。将 Excel 的功能丰富的环境保存在应…

一文了解Gralde

&#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公司实习&#x1f…

蓝桥杯·3月份刷题集训Day02

本篇博客旨在记录自已打卡蓝桥杯3月份刷题集训&#xff0c;同时会有自己的思路及代码解答希望可以给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉&#x1f4aa;。 文…

第14届蓝桥杯STEMA测评真题剖析-2023年3月12日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第113讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

JavaScript 应用

目录 1、编程实现“计算任意区间内连续自然数的累加和”页面。 代码实现 2、应用 appendChild()方法和 getElementById()方法实现年月日的联动功能。 代码 1、编程实现“计算任意区间内连续自然数的累加和”页面。 &#xff08;1&#xff09;文档结构的创建 启动程序&#…

若依框架---权限管理设计

前言 若依权限管理包含两个部分&#xff1a;菜单权限 和 数据权限。菜单权限控制着我们可以执行哪些操作。数据权限控制着我们可以看到哪些数据。 菜单是一个概括性名称&#xff0c;可以细分为目录、菜单和按钮&#xff0c;以若依自身为例&#xff1a; 目录&#xff0c;就是页…

acm省赛:高桥和低桥(三种做法:区间计数、树状数组、线段树)

题目描述 有个脑筋急转弯是这样的&#xff1a;有距离很近的一高一低两座桥&#xff0c;两次洪水之后高桥被淹了两次&#xff0c;低桥却只被淹了一次&#xff0c;为什么&#xff1f;答案是&#xff1a;因为低桥太低了&#xff0c;第一次洪水退去之后水位依然在低桥之上&#xff…

Linux内核IO基础知识与概念

什么是 IO在计算机操作系统中&#xff0c;所谓的I/O就是 输入&#xff08;Input&#xff09;和输出&#xff08;Output&#xff09;&#xff0c;也可以理解为读&#xff08;Read&#xff09;和写&#xff08;Write)&#xff0c;针对不同的对象&#xff0c;I/O模式可以划分为磁盘…

<Linux>进程控制

进程控制 文章目录进程控制一、进程创建1.fork函数认识2.写时拷贝3.fork常规用法4.fork调用失败的原因二、进程终止1.进程退出场景2.进程退出码3.进程退出的方式三、进程等待1.进程等待是什么&#xff1f;2.进程等待的必要性3.进程等待的方法3.1.wait函数3.2.waitpid函数4.如何…

为什么 ChatGPT 输出时经常会中断,需要输入“继续” 才可以继续输出?

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

树莓派Pico开发板I2C OLED显示模块接口与MicroPython编程

首先简要介绍I2C接口及I2C接口OLED显示模块&#xff0c;然后讲述Pico开发板I2C总线引脚及其与I2C总线OLED SSD1306显示模块的接口原理&#xff0c;最后给出Pico开发板控制OLED屏显示文字/图形的MicroPython程序实例。 一、I2C接口简介 I2C/IIC/I2C&#xff08;Inter-Integrated…

Linux内核Socket通信原理和实例讲解

关于对 Socket 的认识&#xff0c;大致分为下面几个主题&#xff0c;Socket 是什么&#xff0c;Socket 是如何创建的&#xff0c;Socket 是如何连接并收发数据的&#xff0c;Socket 套接字的删除等。Socket 是什么以及创建过程一个数据包经由应用程序产生&#xff0c;进入到协议…

平板触控笔哪些品牌好?ipad触控笔推荐平价

苹果电容笔与平替电容笔两者需要根据我们的预算以及需求去选择&#xff0c;要是日常多用于用于绘画&#xff0c;建议可以用Apple Pencil&#xff0c;而对于日常仅仅用于学习与记笔记&#xff0c;可以用平替电容笔&#xff0c;由于平替电容笔的品质与表现都非常优秀。小编整理了…

初识进程

文章目录一、进程的概念1. 进程是什么及进程的管理2. Linux 下的 pcb3. 系统调用接口 getpid 和 getppid4. 系统调用接口 fork一、进程的概念 1. 进程是什么及进程的管理 在 Linux下 ./binaryfile 运行一个程序或者在 Windows下双击运行一个程序时&#xff0c;程序就变成了一个…

【百面成神】spring基础12问,你能坚持到第几问

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;java面试宝典&#xff0c;特点&#xff1a;全、精、深、简&#xff0c;力求每个核心知识点1分钟回答好。 &#x1f3…

RK3588平台开发系列讲解(视频篇)RTP H264 码流打包详解

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、单 NALU 封包方式二、组合封包方式三、分片封包方式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 H264 码流是放在 RTP 的有效载荷部分的。因此有效载荷前面的 RTP 头部跟码流本身是没有关系的,所以我…