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

您所在的位置:网站首页 码垛的基本形式 第十三届蓝桥杯省赛 python B组复盘

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

#第十三届蓝桥杯省赛 python B组复盘| 来源: 网络整理| 查看: 265

文章目录 前言主要内容🦞试题 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3