├── .idea ├── .gitignore ├── vcs.xml ├── inspectionProfiles │ └── profiles_settings.xml ├── modules.xml ├── misc.xml └── lanqiao.iml ├── 数据 ├── maze2 ├── team.txt ├── num ├── m ├── com_info └── maze ├── 蓝桥真题解析 ├── 15.125MB.py ├── 矩形切割.py ├── 修改数组.py ├── 约数个数.py ├── 平方和.py ├── 质数.py ├── 旋转.py ├── FJ字符串.py ├── 数列求值.py ├── 最大降雨量.py ├── 数字9.py ├── RAS解密.py ├── 换钞票.py ├── 组队.py ├── 括号.py ├── 特别数的和.py ├── 递增三元组.py ├── 数的分解.py ├── 晚会节目单.py ├── 平闰年.py ├── 糖果.py ├── 年号字串.py ├── 方格分割.py ├── 数位递增的数.py ├── 合根植物.py ├── 人物相关性分析.py ├── 第几个幸运数.py ├── 乘积尾零.py ├── 序列计数.py ├── 分数.py ├── 完全二叉树的和.py ├── 全球变暖.py ├── 音节判断.py ├── 等差素数列.py ├── 长草.py ├── 外卖店优先级.py ├── 等差数列.py ├── 不同子串.py ├── 判断两个圆之间的关系.py ├── 叶节点数.py ├── 承压计算.py ├── 迷宫2.py ├── 迷宫.py ├── 植树.py ├── test.py └── 购物单.py └── README.md /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /workspace.xml -------------------------------------------------------------------------------- /数据/maze2: -------------------------------------------------------------------------------- 1 | UDDLUULRUL 2 | UURLLLRRRU 3 | RRUURLDLRD 4 | RUDDDDUUUU 5 | URUDLLRRUU 6 | DURLRLDLRL 7 | ULLURLLRDU 8 | RDLULLRDDD 9 | UUDDUDUDLL 10 | ULRDLUURRR -------------------------------------------------------------------------------- /蓝桥真题解析/15.125MB.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 在计算机存储中,15.125GB是多少MB? 4 | 【答案提交】 5 | 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 6 | """ 7 | print(15.125 * 1024) 8 | 9 | 10 | -------------------------------------------------------------------------------- /蓝桥真题解析/矩形切割.py: -------------------------------------------------------------------------------- 1 | mat = [2019, 324] 2 | # mat = [5, 3] 3 | count = 0 4 | while mat[0] >= 1 and mat[1] >= 1: 5 | mat[mat.index(max(mat))] = max(mat) - min(mat) 6 | count += 1 7 | print(count) # 21 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /蓝桥真题解析/修改数组.py: -------------------------------------------------------------------------------- 1 | n = int(input()) 2 | lst = list(map(int, input().split())) 3 | new_lst = [] 4 | 5 | for item in lst: 6 | while item in new_lst: 7 | item += 1 8 | new_lst.append(item) 9 | 10 | print(*new_lst) 11 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /蓝桥真题解析/约数个数.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 1200000有多少个约数(只计算正约数)。 4 | 【答案提交】 5 | 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 6 | """ 7 | count = 2 8 | for i in range(2, 1200000): 9 | if 1200000 % i == 0: 10 | count += 1 11 | # print(i) 12 | print(count) -------------------------------------------------------------------------------- /蓝桥真题解析/平方和.py: -------------------------------------------------------------------------------- 1 | total = 0 2 | 3 | for i in range(1, 2020): 4 | num = i 5 | while num != 0: 6 | a = num % 10 7 | if a in [2, 0, 1, 9]: 8 | total += i ** 2 9 | break 10 | num = num // 10 11 | 12 | print(total) 13 | # 2658417853 14 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /蓝桥真题解析/质数.py: -------------------------------------------------------------------------------- 1 | def is_prim(n): 2 | if n == 1: 3 | return False 4 | for i in range(2, n): 5 | if n % i == 0: 6 | return False 7 | return True 8 | 9 | 10 | ans = 0 11 | i = 1 12 | while i <= 2019: 13 | if is_prim(i): 14 | ans += 1 15 | i += 1 16 | 17 | print(ans) # 306 18 | -------------------------------------------------------------------------------- /蓝桥真题解析/旋转.py: -------------------------------------------------------------------------------- 1 | n, m = list(map(int, input().split())) 2 | fig = [list(map(int, input().split())) for i in range(n)] 3 | new_fig = [[0 for i in range(n)] for i in range(m)] 4 | 5 | for i in range(m): 6 | for j in range(n): 7 | new_fig[i][j] = fig[n-j-1][i] 8 | 9 | for i in range(m): 10 | print(*new_fig[i]) 11 | """ 12 | 3 4 13 | 1 3 5 7 14 | 9 8 7 6 15 | 3 5 9 7 16 | """ 17 | -------------------------------------------------------------------------------- /数据/team.txt: -------------------------------------------------------------------------------- 1 | 1 97 90 0 0 0 2 | 2 92 85 96 0 0 3 | 3 0 0 0 0 93 4 | 4 0 0 0 80 86 5 | 5 89 83 97 0 0 6 | 6 82 86 0 0 0 7 | 7 0 0 0 87 90 8 | 8 0 97 96 0 0 9 | 9 0 0 89 0 0 10 | 10 95 99 0 0 0 11 | 11 0 0 96 97 0 12 | 12 0 0 0 93 98 13 | 13 94 91 0 0 0 14 | 14 0 83 87 0 0 15 | 15 0 0 98 97 98 16 | 16 0 0 0 93 86 17 | 17 98 83 99 98 81 18 | 18 93 87 92 96 98 19 | 19 0 0 0 89 92 20 | 20 0 99 96 95 81 21 | -------------------------------------------------------------------------------- /.idea/lanqiao.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /蓝桥真题解析/FJ字符串.py: -------------------------------------------------------------------------------- 1 | """ 2 | 问题描述 3 |   FJ在沙盘上写了这样一些字符串: 4 |   A1 = “A” 5 |   A2 = “ABA” 6 |   A3 = “ABACABA” 7 |   A4 = “ABACABADABACABA” 8 |   … … 9 |   你能找出其中的规律并写所有的数列AN吗? 10 | 输入格式 11 |   仅有一个数:N ≤ 26。 12 | 输出格式 13 |   请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。 14 | 样例输入 15 | 3 16 | 样例输出 17 | ABACABA 18 | """ 19 | n = int(input()) 20 | s = '' 21 | for i in range(n): 22 | s = s + chr(ord('A') + i) + s 23 | print(s) 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /蓝桥真题解析/数列求值.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。 4 | 求第 20190324 项的最后 4 位数字。 5 | 【答案提交】 6 | 这是一道结果填空的题,你只需要算出结果后提交即可。 7 | 本题的结果为一个 4 位整数(提示:答案的千位不为 0), 8 | 在提交答案时只填写这个整数,填写多余的内容将无法得分。 9 | """ 10 | # 本来想考虑用生成器来做,以达到节省内存的效果。 11 | # 但是尝试了一下发现不太行。 12 | # 有哪位大神可以解决吗? 13 | # 望分享。 14 | lst = [1, 1, 1] 15 | for i in range(3, 20190324): 16 | lst.append((lst[i-3] + lst[i-2] + lst[i-1]) % 10000) 17 | print(lst[-1]) # 4659 18 | -------------------------------------------------------------------------------- /蓝桥真题解析/最大降雨量.py: -------------------------------------------------------------------------------- 1 | # 解法一: 2 | """ 3 | 1 2 3 46 47 48 49 4 | 4 5 6 42 43 44 45 5 | 7 8 9 38 39 40 41 6 | 10 11 12 34 35 36 37 7 | 13 14 15 30 31 32 33 8 | 16 17 18 26 27 28 29 9 | 19 20 21 22 23 24 25 10 | """ 11 | # 最大中位数为34 12 | # 横轴为天 13 | # 纵轴为周 14 | 15 | # 解法二: 16 | # 我们设每周的中位数分别为 17 | # a b c x d e f 18 | # x就是我们要求的值,我们要最大x 19 | # x为中位数,则x后边的三个数,和包括def和其后边的三个数都要比x大 20 | # 那么最大的 x = 49 - (3 + 4 * 3) = 49 - 15 = 34 21 | 22 | # 34 23 | -------------------------------------------------------------------------------- /蓝桥真题解析/数字9.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 在1至2019中,有多少个数的数位中包含数字9? 4 | 注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。 5 | 【答案提交】 6 | 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 7 | """ 8 | def contain(num): 9 | while num != 0: 10 | temp = num % 10 11 | num = num // 10 12 | if temp == 9: 13 | return True 14 | return False 15 | 16 | 17 | count = 0 18 | for i in range(1, 2020): 19 | if contain(i): 20 | count += 1 21 | print(count) 22 | -------------------------------------------------------------------------------- /数据/num: -------------------------------------------------------------------------------- 1 | 5650 4542 3554 473 946 4114 3871 9073 90 4329 2 | 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 3 | 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 4 | 1486 5722 3135 1170 4014 5510 5120 729 2880 9019 5 | 2049 698 4582 4346 4427 646 9742 7340 1230 7683 6 | 5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 7 | 6701 6645 1671 5978 2704 9926 295 3125 3878 6785 8 | 2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 9 | 3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 10 | 689 5510 8243 6114 337 4096 8199 7313 3685 211 -------------------------------------------------------------------------------- /蓝桥真题解析/RAS解密.py: -------------------------------------------------------------------------------- 1 | # 对一个数进行因式分解 2 | # def factorization(num): 3 | # i = 2 4 | # while i ** 2 <= num: 5 | # while num % i == 0 and num != 1: 6 | # print(i, num / i) 7 | # num /= i 8 | # i += 1 9 | # 10 | # 11 | # factorization(1001733993063167141) # p = 891234941 q = 1123984201 12 | p = 891234941 13 | q = 1123984201 14 | d = 212353 15 | mod = (p - 1) * (q - 1) 16 | 17 | for e in range(1000000000, 10000000000): 18 | if d * e % mod == 1: 19 | print(e) 20 | break 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /蓝桥真题解析/换钞票.py: -------------------------------------------------------------------------------- 1 | """ 2 | x星球的钞票的面额只有:100元,5元,2元,1元,共4种。 3 | 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。 4 | 小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍, 5 | 剩下的当然都是5元面额的。 6 | 7 | 银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗? 8 | (5元,2元,1元面额的必须都有,不能是0) 9 | 10 | 注意,需要提交的是一个整数,不要填写任何多余的内容。 11 | """ 12 | 13 | 14 | def change_money(): 15 | money = 200 16 | lst = [] 17 | for i in range(1, 10): 18 | if (money - i - 2 * i * 10) % 5 == 0: 19 | lst.append(i + i * 10 + (money - i - 2 * i * 10) // 5) 20 | 21 | return min(lst) 22 | 23 | 24 | if __name__ == '__main__': 25 | print(change_money()) 26 | 27 | """ 28 | 结果为74 29 | 30 | 其实本题的解就一个,就为74. 31 | """ 32 | 33 | -------------------------------------------------------------------------------- /蓝桥真题解析/组队.py: -------------------------------------------------------------------------------- 1 | class Team: 2 | def __init__(self, info): 3 | self.info = info 4 | 5 | 6 | team = [] 7 | ans = 0 8 | 9 | with open('../数据/team.txt', mode='r', encoding='utf-8') as f: 10 | for line in f: 11 | team.append(Team(list(line.strip().split()))) 12 | 13 | for i in range(20): 14 | for j in range(i+1, 20): 15 | for k in range(j+1, 20): 16 | for m in range(k+1, 20): 17 | for n in range(m+1, 20): 18 | temp = int(team[i].info[1]) + int(team[j].info[2]) + int(team[k].info[3]) + int(team[m].info[4]) + int(team[n].info[5]) 19 | if temp > ans: 20 | ans = temp 21 | 22 | print(ans) 23 | -------------------------------------------------------------------------------- /蓝桥真题解析/括号.py: -------------------------------------------------------------------------------- 1 | """ 2 | 问题描述 3 | 由1对括号,可以组成一种合法括号序列:()。 4 |   由2对括号,可以组成两种合法括号序列:()()、(())。 5 |   由4对括号组成的合法括号序列一共有多少种? 6 | """ 7 | 8 | """ 9 | 第一种方法:手算。 10 | 深度为1的:() () () () 1 11 | 深度为2的:(()) () (), () (()) (), () () (()), (()) (()), (()()) (), () (()()), (()()()) 7 12 | 深度为3的:((()) (), () ((())), (()(())), ((())()), ((()())) 5 13 | 深度为4的:(((()))) 1 14 | 1+7+5+1 = 14 15 | """ 16 | 17 | 18 | # 第二种方法:代码。 19 | def match(left, right): 20 | global n, ans 21 | if left == n: 22 | ans += 1 23 | return 24 | match(left + 1, right) 25 | if left > right: 26 | match(left, right + 1) 27 | 28 | 29 | def get_num(): 30 | global ans,n 31 | match(0, 0) 32 | return ans 33 | 34 | 35 | n = 4 36 | ans = 0 37 | 38 | if __name__ == '__main__': 39 | print(get_num()) # 14 40 | -------------------------------------------------------------------------------- /蓝桥真题解析/特别数的和.py: -------------------------------------------------------------------------------- 1 | """ 2 | 小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0), 3 | 在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个, 4 | 他们的和是 574。 请问,在 1 到 n 中,所有这样的数的和是多少? 5 | 6 | 输入一行包含一个整数 n。 7 | 8 | 输出一行,包含一个整数,表示满足条件的数的和。 9 | 10 | 【样例输入】 11 | 12 | 40 13 | 【样例输出】 14 | 15 | 574 16 | 17 | 对于 20% 的评测用例,1≤n≤10。 18 | 对于 50% 的评测用例,1≤n≤100。 19 | 对于 80% 的评测用例,1≤n≤1000。 20 | 对于所有评测用例,1≤n≤10000。 21 | """ 22 | # import time 23 | # start = time.time() 24 | n = int(input()) 25 | num = 0 26 | # for i in range(1, 10000 + 1): 27 | for i in range(1, n + 1): 28 | a = i 29 | while a != 0: 30 | b = a % 10 31 | if b in [2, 0, 1, 9]: 32 | num += i 33 | break 34 | a = a // 10 35 | print(num) 36 | # end = time.time() 37 | # print(end - start) 38 | # 10000 39 | # 41951713 40 | # 0.004991292953491211s 41 | # 数据规模不大,直接暴力求解 42 | -------------------------------------------------------------------------------- /蓝桥真题解析/递增三元组.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0 tou: 46 | tou = i 47 | break 48 | if tou >= MAX: 49 | break 50 | # print(lst) 51 | print(len(s)) # 1905 52 | -------------------------------------------------------------------------------- /蓝桥真题解析/乘积尾零.py: -------------------------------------------------------------------------------- 1 | """ 2 | 如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 3 | 4 | 5 | 5650 4542 3554 473 946 4114 3871 9073 90 4329 6 | 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 7 | 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 8 | 1486 5722 3135 1170 4014 5510 5120 729 2880 9019 9 | 2049 698 4582 4346 4427 646 9742 7340 1230 7683 10 | 5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 11 | 6701 6645 1671 5978 2704 9926 295 3125 3878 6785 12 | 2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 13 | 3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 14 | 689 5510 8243 6114 337 4096 8199 7313 3685 211 15 | 16 | 17 | 注意:需要提交的是一个整数,表示末尾零的个数。不要填写任何多余内容。 18 | """ 19 | # 只有2和5才能产生0,所以我们把每个数分解成2*5*x 最后记录2和5的个数,最少的那个数的个数就是结果 20 | 21 | with open('../数据/num', mode='r', encoding='utf-8') as f: 22 | c2 = c5 = 0 23 | for line in f: 24 | line = line.strip().split() 25 | for i in line: 26 | num1 = num2 = int(i) 27 | while num1 % 2 == 0: 28 | num1 = num1 // 2 29 | c2 += 1 30 | while num2 % 5 == 0: 31 | num2 = num2 // 5 32 | c5 += 1 33 | print(min(c2, c5)) # 31 34 | -------------------------------------------------------------------------------- /蓝桥真题解析/序列计数.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 小明想知道,满足以下条件的正整数序列的数量: 4 | 1. 第一项为 n; 5 | 2. 第二项不超过 n; 6 | 3. 从第三项开始,每一项小于前两项的差的绝对值。 7 | 请计算,对于给定的 n,有多少种满足条件的序列。 8 | 【输入格式】 9 | 输入一行包含一个整数 n。 10 | 【输出格式】 11 | 输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。 12 | 【样例输入】 13 | 4 14 | 【样例输出】 15 | 7 16 | 【样例说明】 17 | 以下是满足条件的序列: 18 | 4 1 19 | 4 1 1 20 | 4 1 2 21 | 4 2 22 | 4 2 1 23 | 4 3 24 | 4 4 25 | 【评测用例规模与约定】 26 | 对于 20% 的评测用例,1 <= n <= 5; 27 | 对于 50% 的评测用例,1 <= n <= 10; 28 | 对于 80% 的评测用例,1 <= n <= 100; 29 | 对于所有评测用例,1 <= n <= 1000。 30 | """ 31 | # def func(a, b): 32 | # global ans 33 | # res = 1 34 | # while res < abs(a - b): 35 | # func(b, res) 36 | # res += 1 37 | # ans += 1 38 | # 39 | # n = int(input()) 40 | # ans = 0 41 | # for i in range(1, n+1): 42 | # func(n, i) 43 | # print(ans) 44 | import sys 45 | sys.setrecursionlimit(10000) 46 | def dfs(old, now): 47 | if now <= 0: 48 | return 0 49 | if hx[old][now] != 0: 50 | return hx[old][now] 51 | hx[old][now] = (1 + dfs(old, now - 1) + dfs(now, abs(old - now) - 1)) % 10000 52 | return hx[old][now] 53 | 54 | n = int(input()) 55 | hx = [[0] * (n+1) for i in range(n+1)] 56 | print(dfs(n, n)) 57 | print(hx) 58 | 59 | -------------------------------------------------------------------------------- /蓝桥真题解析/分数.py: -------------------------------------------------------------------------------- 1 | """ 2 | 标题:分数 3 | 4 | 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + … 5 | 每项是前一项的一半,如果一共有20项, 6 | 求这个和是多少,结果用分数表示出来。 7 | 类似: 8 | 3/2 9 | 当然,这只是加了前2项而已。分子分母要求互质。 10 | 11 | 注意: 12 | 需要提交的是已经约分过的分数,中间任何位置不能含有空格。 13 | 请不要填写任何多余的文字或符号 14 | """ 15 | 16 | 17 | # def gcd(a, b): 18 | # while a % b != 0: 19 | # c = a % b 20 | # a = b 21 | # b = c 22 | # return c 23 | # 24 | # 25 | # def get_num(n): 26 | # fenzi = 0 27 | # fenmu = 2 ** (n - 1) 28 | # for i in range(n): 29 | # fenzi += 2 ** i 30 | # mcf = gcd(fenmu, fenzi) 31 | # 32 | # return f'{fenzi // mcf}/{fenmu // mcf}' 33 | # 34 | # 35 | # if __name__ == '__main__': 36 | # print(get_num(20)) # 1048575/524288 37 | # # print(gcd(20, 35)) # 5 38 | 39 | # 快速幂运算 这里只考虑正数次幂 40 | def power(base, exp): 41 | res = 1 42 | while exp > 0: 43 | if exp & 1: # 按位与 10的二进制 1010 44 | res *= base 45 | exp >>= 1 # 右移1位 46 | base *= base 47 | return res 48 | 49 | # 最大公约数 50 | def gcd(a, b): 51 | if b == 0: 52 | return a 53 | return gcd(b, a%b) 54 | 55 | a = power(2, 20)-1 56 | b = power(2, 19) 57 | c = gcd(a, b) 58 | print(a//c, '/', b//c) 59 | -------------------------------------------------------------------------------- /蓝桥真题解析/完全二叉树的和.py: -------------------------------------------------------------------------------- 1 | """ 2 | 给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值, 3 | 按从上到下、从左到右的顺序依次是 A1, A2, · · · AN,如下图所示: 4 | 5 | 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大? 6 | 如果有多个深度的权值和同为最大,请你输出其中最小的深度。 7 | 8 | 注:根的深度是 1。 9 | 10 | 第一行包含一个整数 N。 11 | 第二行包含 N 个整数 A1, A2, · · · AN 。 12 | 13 | 输出一个整数代表答案 14 | 15 | 7 16 | 1 6 5 4 3 2 1 17 | 18 | 2 19 | """ 20 | 21 | 22 | def get_deep(): 23 | n = int(input()) 24 | lst = list(map(int, input().split())) 25 | deep = 1 26 | while 2 ** deep - 1 <= n: 27 | lst[deep - 1] = sum(lst[2 ** (deep - 1) - 1:2 ** deep - 1]) 28 | deep += 1 29 | if 2 ** (deep - 1) - 1 < n: 30 | lst[deep - 1] = sum(lst[2 ** (deep - 1) - 1:]) 31 | return lst.index(max(lst)) + 1 32 | 33 | 34 | if __name__ == '__main__': 35 | print(get_deep()) 36 | 37 | 38 | """ 39 | 注释: 40 | 1. map(int, input().split()) 41 | 这产生的是一个生成器, next一次会得到一个值 42 | list可以全部结收生成器中的值并返回一个列表 43 | gen = map(int, input().split()) 44 | print(next(gen)) 45 | print(next(gen)) 46 | print(next(gen)) 47 | print(next(gen)) 48 | print(next(gen)) 49 | 50 | 1 6 5 4 3 2 1 51 | 1 52 | 6 53 | 5 54 | 4 55 | 3 56 | 2. 完全二叉树的特性 57 | 每一层的结点数:2 ** deep 58 | 满二叉树的总结点数:2 ** deep - 1 59 | 3. lst.index(a) 60 | 返回值为列表中最先出现a的索引值 61 | 加1后在此就是a对应的最小深度 62 | """ 63 | 64 | -------------------------------------------------------------------------------- /蓝桥真题解析/全球变暖.py: -------------------------------------------------------------------------------- 1 | """ 2 | 你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示: 3 | ....... 4 | .##.... 5 | .##.... 6 | ....##. 7 | ..####. 8 | ...###. 9 | ....... 10 | 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。 11 | 由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。 12 | 例如上图中的海域未来会变成如下样子: 13 | ....... 14 | ....... 15 | ....... 16 | ....... 17 | ....#.. 18 | ....... 19 | ....... 20 | 21 | 请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。 22 | 23 | 【输入格式】 24 | 第一行包含一个整数N。 (1 <= N <= 1000) 25 | 26 | 以下N行N列代表一张海域照片。 27 | 28 | 照片保证第1行、第1列、第N行、第N列的像素都是海洋。 29 | 30 | 【输出格式】 31 | 32 | 一个整数表示答案 33 | """ 34 | def dfs(x, y): 35 | if fig[x][y] == '.': 36 | return 37 | 38 | direction = [[-1, 0], [1, 0], [0, -1], [0, 1]] 39 | for i in range(4): 40 | tx = x + direction[i][0] 41 | ty = y + direction[i][1] 42 | if 0 <= tx < n and 0 <= ty <= n and vis[tx][ty] != 1: 43 | if fig[tx][ty] == '.': 44 | fig[x][y] = '.' 45 | vis[x][y] = 1 46 | return 47 | 48 | 49 | n = int(input()) 50 | fig = [list(input()) for _ in range(n)] 51 | vis = [[0] * n for i in range(n)] 52 | ans = 0 53 | 54 | for i in range(n): 55 | for j in range(n): 56 | dfs(i, j) 57 | 58 | for line in fig: 59 | for c in line: 60 | if c == '#': 61 | ans += 1 62 | 63 | print(ans) -------------------------------------------------------------------------------- /蓝桥真题解析/音节判断.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。 4 | 给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。 5 | 元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。 6 | 【输入格式】 7 | 输入一行,包含一个单词,单词中只包含小写英文字母。 8 | 【输出格式】 9 | 输出答案,或者为yes,或者为no。 10 | 【样例输入】 11 | lanqiao 12 | 【样例输出】 13 | yes 14 | 【样例输入】 15 | world 16 | 【样例输出】 17 | no 18 | 【评测用例规模与约定】 19 | 对于所有评测用例,单词中的字母个数不超过100。 20 | """ 21 | 22 | 23 | def is_yuan(c): 24 | if c in ['a', 'e', 'i', 'o', 'u']: 25 | return True 26 | else: 27 | return False 28 | 29 | 30 | def yuan(): 31 | global pos 32 | ans = 0 33 | while pos < len(s): 34 | if is_yuan(s[pos]): 35 | pos += 1 36 | ans += 1 37 | else: 38 | break 39 | return ans 40 | 41 | 42 | def zhuo(): 43 | global pos 44 | ans = 0 45 | # 0 为False 非0为True 46 | # 一共四段,如果哪段ans为0,则那段不符合规则 47 | while pos < len(s): 48 | if is_yuan(s[pos]): 49 | break 50 | pos += 1 51 | ans += 1 52 | return ans 53 | 54 | 55 | def search(): 56 | if zhuo() and yuan() and zhuo() and yuan() and pos == len(s): 57 | return True 58 | else: 59 | return False 60 | 61 | 62 | pos = 0 63 | s = input() 64 | 65 | if search(): 66 | print('yes') 67 | else: 68 | print('no') 69 | 70 | 71 | -------------------------------------------------------------------------------- /蓝桥真题解析/等差素数列.py: -------------------------------------------------------------------------------- 1 | """ 2 | 难度系数:*** 3 | 4 | 2,3,5,7,11,13,…是素数序列。 5 | 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。 6 | 上边的数列公差为30,长度为6。 7 | 8 | 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 9 | 这是数论领域一项惊人的成果! 10 | 11 | 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 12 | 13 | 长度为10的等差素数列,其公差最小值是多少? 14 | 15 | 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。 16 | """ 17 | 18 | 19 | def init_num(): 20 | global tot 21 | for i in range(2, N): 22 | if dp[i] == 1: 23 | continue 24 | prim[tot] = i # 记录N以内的所有素数 25 | tot += 1 26 | j = i 27 | while i * j < N: 28 | dp[i * j] = 1 # 不是素数的位置标记1 29 | j += 1 30 | 31 | 32 | def get_dif(): 33 | global dif 34 | init_num() 35 | 36 | # print(dp[:100]) 37 | # print(prim[:100]) 38 | 39 | # print(tot) 40 | 41 | while dif * 10 < N: 42 | for j in range(tot): 43 | flag, temp = True, prim[j] 44 | for k in range(1, 10): # temp后边是否再有9个满足等差条件的素数 45 | if temp + dif >= N or dp[temp + dif] == 1: 46 | flag = False 47 | break 48 | else: 49 | temp += dif 50 | if flag: 51 | # print(dif, prim[j]) 52 | return dif 53 | dif += 1 54 | 55 | 56 | N = 1000010 57 | dp = [1, 1] + [0] * N 58 | tot = 0 59 | dif = 1 60 | prim = [0] * N 61 | 62 | if __name__ == '__main__': 63 | # print(is_prime(2)) 64 | print(get_dif()) 65 | 66 | -------------------------------------------------------------------------------- /数据/m: -------------------------------------------------------------------------------- 1 | 7 2 | 5 8 3 | 7 8 8 4 | 9 2 7 2 5 | 8 1 4 9 1 6 | 8 1 8 8 4 1 7 | 7 9 6 1 4 5 4 8 | 5 6 5 5 6 9 5 6 9 | 5 5 4 7 9 3 5 5 1 10 | 7 5 7 9 7 4 7 3 3 1 11 | 4 6 4 5 5 8 8 3 2 4 3 12 | 1 1 3 3 1 6 6 5 5 4 4 2 13 | 9 9 9 2 1 9 1 9 2 9 5 7 9 14 | 4 3 3 7 7 9 3 6 1 3 8 8 3 7 15 | 3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 16 | 8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 17 | 8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 18 | 2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 19 | 7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 20 | 9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 21 | 5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 22 | 6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 23 | 2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 24 | 7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 25 | 1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 26 | 2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 27 | 7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9 28 | 7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6 29 | 5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1 30 | X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 31 | -------------------------------------------------------------------------------- /蓝桥真题解析/长草.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。 4 | 小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。 5 | 这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。 6 | 请告诉小明,k 个月后空地上哪些地方有草。 7 | 【输入格式】 8 | 输入的第一行包含两个整数 n, m。 9 | 接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。 10 | 接下来包含一个整数 k。 11 | 【输出格式】 12 | 输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。 13 | 【样例输入】 14 | 4 5 15 | .g... 16 | ..... 17 | ..g.. 18 | ..... 19 | 2 20 | 【样例输出】 21 | gggg. 22 | gggg. 23 | ggggg 24 | .ggg. 25 | 【评测用例规模与约定】 26 | 对于 30% 的评测用例,2 <= n, m <= 20。 27 | 对于 70% 的评测用例,2 <= n, m <= 100。 28 | 对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。 29 | """ 30 | def grow_grass(x, y): 31 | for i in range(4): 32 | tx = x + direction[i][0] 33 | ty = y + direction[i][1] 34 | if 0 <= tx < n and 0 <= ty < m: 35 | if arr[tx][ty] == '.': 36 | arr[tx][ty] = 'g' 37 | map_arr[tx][ty] = 1 38 | 39 | 40 | n, m = list(map(int, input().split())) 41 | arr = [list(input()) for _ in range(n)] 42 | k = int(input()) 43 | map_arr = [] 44 | direction = [(0, -1), (0, 1), (-1, 0), (1, 0)] 45 | 46 | for i in range(k): 47 | map_arr = [[0] * m for i in range(n)] 48 | for p in range(n): 49 | for q in range(m): 50 | if arr[p][q] == 'g' and map_arr[p][q] == 0: 51 | map_arr[p][q] = 1 52 | grow_grass(p, q) 53 | 54 | for line in arr: 55 | print(*line, sep='') 56 | -------------------------------------------------------------------------------- /数据/com_info: -------------------------------------------------------------------------------- 1 | **** 180.90 88折 2 | **** 10.25 65折 3 | **** 56.14 9折 4 | **** 104.65 9折 5 | **** 100.30 88折 6 | **** 297.15 半价 7 | **** 26.75 65折 8 | **** 130.62 半价 9 | **** 240.28 58折 10 | **** 270.62 8折 11 | **** 115.87 88折 12 | **** 247.34 95折 13 | **** 73.21 9折 14 | **** 101.00 半价 15 | **** 79.54 半价 16 | **** 278.44 7折 17 | **** 199.26 半价 18 | **** 12.97 9折 19 | **** 166.30 78折 20 | **** 125.50 58折 21 | **** 84.98 9折 22 | **** 113.35 68折 23 | **** 166.57 半价 24 | **** 42.56 9折 25 | **** 81.90 95折 26 | **** 131.78 8折 27 | **** 255.89 78折 28 | **** 109.17 9折 29 | **** 146.69 68折 30 | **** 139.33 65折 31 | **** 141.16 78折 32 | **** 154.74 8折 33 | **** 59.42 8折 34 | **** 85.44 68折 35 | **** 293.70 88折 36 | **** 261.79 65折 37 | **** 11.30 88折 38 | **** 268.27 58折 39 | **** 128.29 88折 40 | **** 251.03 8折 41 | **** 208.39 75折 42 | **** 128.88 75折 43 | **** 62.06 9折 44 | **** 225.87 75折 45 | **** 12.89 75折 46 | **** 34.28 75折 47 | **** 62.16 58折 48 | **** 129.12 半价 49 | **** 218.37 半价 50 | **** 289.69 8折 -------------------------------------------------------------------------------- /数据/maze: -------------------------------------------------------------------------------- 1 | 01010101001011001001010110010110100100001000101010 2 | 00001000100000101010010000100000001001100110100101 3 | 01111011010010001000001101001011100011000000010000 4 | 01000000001010100011010000101000001010101011001011 5 | 00011111000000101000010010100010100000101100000000 6 | 11001000110101000010101100011010011010101011110111 7 | 00011011010101001001001010000001000101001110000000 8 | 10100000101000100110101010111110011000010000111010 9 | 00111000001010100001100010000001000101001100001001 10 | 11000110100001110010001001010101010101010001101000 11 | 00010000100100000101001010101110100010101010000101 12 | 11100100101001001000010000010101010100100100010100 13 | 00000010000000101011001111010001100000101010100011 14 | 10101010011100001000011000010110011110110100001000 15 | 10101010100001101010100101000010100000111011101001 16 | 10000000101100010000101100101101001011100000000100 17 | 10101001000000010100100001000100000100011110101001 18 | 00101001010101101001010100011010101101110000110101 19 | 11001010000100001100000010100101000001000111000010 20 | 00001000110000110101101000000100101001001000011101 21 | 10100101000101000000001110110010110101101010100001 22 | 00101000010000110101010000100010001001000100010101 23 | 10100001000110010001000010101001010101011111010010 24 | 00000100101000000110010100101001000001000000000010 25 | 11010000001001110111001001000011101001011011101000 26 | 00000110100010001000100000001000011101000000110011 27 | 10101000101000100010001111100010101001010000001000 28 | 10000010100101001010110000000100101010001011101000 29 | 00111100001000010000000110111000000001000000001011 30 | 10000001100111010111010001000110111010101101111000 -------------------------------------------------------------------------------- /蓝桥真题解析/外卖店优先级.py: -------------------------------------------------------------------------------- 1 | class Order: 2 | """存放信息""" 3 | def __init__(self, ts, id): 4 | self.ts = ts 5 | self.id = id 6 | 7 | 8 | def main(): 9 | n, m, t = list(map(int, input().split())) 10 | info = [] 11 | cash = [] 12 | score = [0 for i in range(n+1)] 13 | for i in range(m): 14 | ts, id_ = list(map(int, input().split())) 15 | info.append(Order(ts, id_)) 16 | # info.sort(key=lambda order: order.ts) 17 | for i in range(1, t+1): 18 | flag = True 19 | for data in info: 20 | if data.ts == i: 21 | # 对应店铺有订单,加上2 22 | score[data.id] += 2 23 | for s in score: 24 | # 没有订单的店铺-1,等于0的不用变化 25 | if score.index(s) == data.id: 26 | continue 27 | elif s == 0: 28 | continue 29 | score[score.index(s)] -= 1 30 | # info.remove(data) 31 | flag = False 32 | else: 33 | # 如果在一个时刻两家都没有订单,都-1 34 | if flag: 35 | for s in score: 36 | if s == 0: 37 | continue 38 | score[score.index(s)] -= 1 39 | for s in score: 40 | # 某一时刻结束后,根据每个店铺的积分,决定改店铺是去是留 41 | if s > 5: 42 | cash.append(score.index(s)) 43 | if s <= 3: 44 | if score.index(s) in cash: 45 | cash.remove(score.index(s)) 46 | print(len(cash)) # 打印缓冲区内的店铺个数 47 | 48 | 49 | if __name__ == '__main__': 50 | main() 51 | 52 | """ 53 | 2 6 6 54 | 1 1 55 | 5 2 56 | 3 1 57 | 6 2 58 | 2 1 59 | 6 2 60 | """ 61 | -------------------------------------------------------------------------------- /蓝桥真题解析/等差数列.py: -------------------------------------------------------------------------------- 1 | """ 2 | 试题 H: 等差数列 3 | 时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分 4 | 【问题描述】 5 | 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 6 | 部分的数列,只记得其中 N 个整数。 7 | 现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有 8 | 几项? 9 | 【输入格式】 10 | 输入的第一行包含一个整数 N。 11 | 第二行包含 N 个整数 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ∼ A N 并不一定是按等差数 12 | 列中的顺序给出) 13 | 【输出格式】 14 | 输出一个整数表示答案。 15 | 【样例输入】 16 | 17 | 5 18 | 2 6 4 10 20 19 | 【样例输出】 20 | 10 21 | 【样例说明】 22 | 包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 23 | 18、20。 24 | 25 | 【评测用例规模与约定】 26 | 对于所有评测用例,2 ≤ N ≤ 100000,0 ≤ A i ≤ 10^ 9 。 27 | """ 28 | 29 | 30 | def get_len(): 31 | n = int(input()) 32 | lst = list(map(int, input().split())) 33 | count = 1 34 | lst.sort() 35 | num = lst[0] 36 | dif = lst[1] - lst[0] 37 | for i in range(2, n): 38 | new_dif = lst[i] - lst[i - 1] 39 | dif = new_dif if new_dif < dif else dif 40 | while num < lst[-1]: 41 | num += dif 42 | count += 1 43 | return count 44 | 45 | 46 | if __name__ == '__main__': 47 | print(get_len()) 48 | 49 | """ 50 | 注释: 51 | 1. sorted 排序 52 | l1 = [22, 33, 1, 2, 7, 4] 53 | l2 = sorted(l1) 54 | # print(l1) # [22, 33, 1, 2, 7, 4] 不会改变原来的数组内容 55 | # print(l2) # [1, 2, 4, 7, 22, 33] 56 | l2 = [('太白',18), ('alex', 73), ('wusir', 35), ('口天吴', 41)] 57 | print(sorted(l2)) # [('alex', 73), ('wusir', 35), ('口天吴', 41), ('太白', 18)] 58 | print(sorted(l2, key=lambda x:x[1])) # 返回的是一个列表 [('太白', 18), ('wusir', 35), ('口天吴', 41), ('alex', 73)] 59 | print(sorted(l2, key=lambda x:x[1], reverse=True)) # 从大到小 60 | 61 | 62 | 2. 列表的sort()方法排序 63 | l1.sort() 64 | print(l1) # [1, 2, 4, 7, 22, 33] 返回值为None 把原来的列表元素从小到大排序,改变原列表内容 65 | l2 = [('太白',18), ('alex', 73), ('wusir', 35), ('口天吴', 41)] 66 | l2.sort(key=lambda x: x[1]) 67 | # print(l2) # [('太白', 18), ('wusir', 35), ('口天吴', 41), ('alex', 73)] 68 | l2.sort(key=lambda x: x[1], reverse=True) 69 | print(l2) # [('alex', 73), ('口天吴', 41), ('wusir', 35), ('太白', 18)] # 从大到小 70 | """ -------------------------------------------------------------------------------- /蓝桥真题解析/不同子串.py: -------------------------------------------------------------------------------- 1 | """ 2 | 一个字符串的非空子串是指字符串中长度至少为1 3 | 的连续的一段字符组成的串。例如,字符串aaab 4 | 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 5 | 7个。 注意在计算时,只算本质不同的串的个数。 6 | 7 | 请问,字符串0100110001010001 8 | 有多少个不同的非空子串? 9 | 10 | 这是一道结果填空的题,你只需要算出结果后提交即可。 11 | 本题的结果为一 个整数,在提交答案时只填写这个整数, 12 | 填写多余的内容将无法得分。 13 | """ 14 | 15 | s = '0100110001010001' 16 | # s = 'aaab' 17 | sep = 1 # 连续的sep个字符的子串 18 | count = 0 19 | set1 = set() # 空集合,利用集合的不重复性 20 | while sep <= len(s): 21 | set1.add(s[0:sep]) 22 | for i in range(len(s) - sep): 23 | set1.add(s[i+1:i+sep+1]) # 集合自动去掉重复的 24 | sep += 1 25 | count += len(set1) # 去重后的个数 26 | print(set1) 27 | set1.clear() 28 | print(count) 29 | # {'b', 'a'} 30 | # {'ab', 'aa'} 31 | # {'aab', 'aaa'} 32 | # 7 33 | # 34 | # {'1', '0'} 35 | # {'10', '11', '01', '00'} 36 | # {'110', '000', '010', '100', '001', '011', '101'} 37 | # {'0101', '0110', '0010', '0001', '1100', '1001', '0011', '1010', '1000', '0100'} 38 | # {'00101', '00010', '11000', '01001', '00110', '01010', '01100', '10011', '10001', '01000', '10100'} 39 | # {'010011', '000101', '001100', '001010', '101000', '010100', '100010', '100110', '010001', '011000', '110001'} 40 | # {'0011000', '0101000', '1000101', '0001010', '1010001', '1001100', '0010100', '1100010', '0110001', '0100110'} 41 | # {'00010100', '10011000', '10001010', '00110001', '11000101', '00101000', '01001100', '01100010', '01010001'} 42 | # {'000101000', '011000101', '110001010', '001010001', '010011000', '001100010', '100110001', '100010100'} 43 | # {'1000101000', '0100110001', '1001100010', '0110001010', '0011000101', '1100010100', '0001010001'} 44 | # {'10011000101', '10001010001', '11000101000', '01001100010', '00110001010', '01100010100'} 45 | # {'011000101000', '001100010100', '010011000101', '100110001010', '110001010001'} 46 | # {'0011000101000', '1001100010100', '0100110001010', '0110001010001'} 47 | # {'01001100010100', '10011000101000', '00110001010001'} 48 | # {'010011000101000', '100110001010001'} 49 | # {'0100110001010001'} 50 | # 100 51 | 52 | # 直接提交100即可 53 | -------------------------------------------------------------------------------- /蓝桥真题解析/判断两个圆之间的关系.py: -------------------------------------------------------------------------------- 1 | """ 2 | Problem B: 判断两个圆之间的关系 3 | Description 4 | 定义Point类,包括double类型的两个属性,分别表示二维空间中一个点的横纵坐标;定义其必要的构造函数和拷贝构造函数。 5 | 定义Circle类,包括Point类的对象和一个double类型的数据作为其属性,分别表示圆心坐标及半径;定义其必要的构造函数、拷贝构造函数。定义Circle类的成员函数: 6 | int JudgeRelation(const Circle& another) 7 | 用于判断当前圆与another之间的位置关系。该函数的返回值根据以下规则确定:当两个圆外离时返回1;当两个圆内含时返回2;当两个圆外切时返回3; 当两个圆内且时返回4;当两个圆相交时返回5。 8 | Input 9 | 第1行N>0表示测试用例个数。 10 | 每个测试用例包括2行,第1行是第1个圆的位置及半径;第2行是第2个圆的位置和半径。 11 | Output 12 | 每个测试用例对应一行输出,输出两个圆之间的位置关系。见样例。 13 | Sample Input 14 | 5 15 | 0 0 10 16 | 20 20 1 17 | 0 0 10 18 | 1 1 4 19 | 0 0 10 20 | 0 20 10 21 | 0 0 10 22 | 0 5 5 23 | 0 0 10 24 | 15 0 10 25 | Sample Output 26 | Outside 27 | Inside 28 | Externally tangent 29 | Internally tangent 30 | Intersection 31 | 外离与内含均指两个圆没有任何交点,但内含是指一个圆完全包含在另一个的内部,否则便是外离。 32 | """ 33 | import math 34 | 35 | 36 | class Point: 37 | def __init__(self, x, y): 38 | self.x = x 39 | self.y = y 40 | 41 | 42 | class Circle: 43 | def __init__(self, center, r): 44 | self.center = center 45 | self.r = r 46 | 47 | def judge_relation(self, another): 48 | dis = math.sqrt((self.center.x - another.center.x) ** 2 + (self.center.y - another.center.y) ** 2) 49 | if self.r + another.r < dis: 50 | # print("外离") 51 | return 'Outside' 52 | elif self.r + another.r == dis: 53 | # print('外切') 54 | return 'Externally tangent' 55 | elif math.fabs(self.r - another.r) < dis < self.r + another.r: 56 | # print('相交') 57 | return 'Intersection' 58 | elif math.fabs(self.r - another.r) == dis: 59 | # print('内切') 60 | return 'Internally tangent' 61 | else: # dis < math.fabs(self.r - another.r) 62 | # print('内含') 63 | return 'Inside' 64 | 65 | 66 | def main(): 67 | n = int(input()) 68 | for i in range(n): 69 | x1, y1, r1 = list(map(int, input().split())) 70 | x2, y2, r2 = list(map(int, input().split())) 71 | one = Circle(Point(x1, y1), r1) 72 | another = Circle(Point(x2, y2), r2) 73 | res = one.judge_relation(another) 74 | print(res) 75 | 76 | 77 | if __name__ == '__main__': 78 | main() 79 | -------------------------------------------------------------------------------- /蓝桥真题解析/叶节点数.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 一棵包含有2019个结点的二叉树,最多包含多少个叶结点? 4 | 【答案提交】 5 | 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 6 | """ 7 | 8 | 9 | class Node: 10 | def __init__(self, item): 11 | self.item = item 12 | self.left = None 13 | self.right = None 14 | 15 | 16 | class Queue: 17 | def __init__(self): 18 | self.items = [] 19 | 20 | def enqueue(self, item): 21 | self.items.append(item) 22 | 23 | def dequeue(self): 24 | if not self.isEmpty(): 25 | return self.items.pop(0) 26 | else: 27 | print('空队列') 28 | 29 | def isEmpty(self): 30 | return self.items == [] 31 | 32 | 33 | class Tree: 34 | def __init__(self): 35 | self.root = None 36 | 37 | def addNode(self, item): 38 | node = Node(item) 39 | cur = self.root 40 | if cur is None: 41 | self.root = node 42 | return 43 | queue = Queue() 44 | queue.enqueue(cur) 45 | while not queue.isEmpty(): 46 | nd = queue.dequeue() 47 | if nd.left is None: 48 | nd.left = node 49 | return 50 | else: 51 | queue.enqueue(nd.left) 52 | if nd.right is None: 53 | nd.right = node 54 | return 55 | else: 56 | queue.enqueue(nd.right) 57 | 58 | def travel(self): 59 | cur = self.root 60 | queue = Queue() 61 | queue.enqueue(cur) 62 | while not queue.isEmpty(): 63 | nd = queue.dequeue() 64 | print(nd.item) 65 | if nd.left is not None: 66 | queue.enqueue(nd.left) 67 | if nd.right is not None: 68 | queue.enqueue(nd.right) 69 | 70 | def findLeaf(self): 71 | count = 0 72 | cur = self.root 73 | queue = Queue() 74 | queue.enqueue(cur) 75 | while not queue.isEmpty(): 76 | nd = queue.dequeue() 77 | if nd.left is None and nd.right is None: 78 | count += 1 79 | else: 80 | if nd.left is not None: 81 | queue.enqueue(nd.left) 82 | if nd.right is not None: 83 | queue.enqueue(nd.right) 84 | return count 85 | 86 | 87 | def main(): 88 | n = 2019 89 | tree = Tree() 90 | for i in range(1, n+1): 91 | tree.addNode(i) 92 | # tree.travel() 93 | print(tree.findLeaf()) 94 | 95 | 96 | if __name__ == '__main__': 97 | main() # 1010 98 | 99 | -------------------------------------------------------------------------------- /蓝桥真题解析/承压计算.py: -------------------------------------------------------------------------------- 1 | """ 2 | X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。 3 | 4 | 每块金属原料的外形、尺寸完全一致,但重量不同。 5 | 金属材料被严格地堆放成金字塔形。 6 | 7 | 7 8 | 5 8 9 | 7 8 8 10 | 9 2 7 2 11 | 8 1 4 9 1 12 | 8 1 8 8 4 1 13 | 7 9 6 1 4 5 4 14 | 5 6 5 5 6 9 5 6 15 | 5 5 4 7 9 3 5 5 1 16 | 7 5 7 9 7 4 7 3 3 1 17 | 4 6 4 5 5 8 8 3 2 4 3 18 | 1 1 3 3 1 6 6 5 5 4 4 2 19 | 9 9 9 2 1 9 1 9 2 9 5 7 9 20 | 4 3 3 7 7 9 3 6 1 3 8 8 3 7 21 | 3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 22 | 8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 23 | 8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 24 | 2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 25 | 7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 26 | 9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 27 | 5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 28 | 6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 29 | 2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 30 | 7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 31 | 1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 32 | 2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 33 | 7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9 34 | 7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6 35 | 5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1 36 | X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 37 | 38 | 其中的数字代表金属块的重量(计量单位较大)。 39 | 最下一层的X代表30台极高精度的电子秤。 40 | 41 | 假设每块原料的重量都十分精确地平均落在下方的两个金属块上, 42 | 最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。 43 | 电子秤的计量单位很小,所以显示的数字很大。 44 | 45 | 工作人员发现,其中读数最小的电子秤的示数为:2086458231 46 | 47 | 请你推算出:读数最大的电子秤的示数为多少? 48 | 49 | 注意:需要提交的是一个整数,不要填写任何多余的内容。 50 | """ 51 | from fnmatch import fnmatchcase as match 52 | 53 | 54 | def get_num(): 55 | data = [] 56 | length = 0 57 | with open('../数据/m', encoding='utf-8') as f: 58 | for line in f: 59 | if match(line, '*X*'): 60 | length = len(line.split()) 61 | break 62 | data.append(list(map(int, line.split()))) 63 | data.append([0] * length) 64 | # print(data, length) 65 | for i in range(1, len(data)): 66 | data[i - 1].insert(0, 0) 67 | data[i - 1].append(0) 68 | # print(data[i - 1]) 69 | for j in range(len(data[i])): 70 | data[i][j] += (data[i - 1][j] / 2 + data[i - 1][j + 1] / 2) 71 | 72 | return 2086458231 / min(data[-1]) * max(data[-1]) 73 | 74 | 75 | if __name__ == '__main__': 76 | print(get_num()) # 72665192664.0 提交整数 72665192664 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /蓝桥真题解析/迷宫2.py: -------------------------------------------------------------------------------- 1 | """ 2 | X星球的一处迷宫游乐场建在某个小山坡上。 3 | 它是由10x10相互连通的小房间组成的。 4 | 房间的地板上写着一个很大的字母。 5 | 我们假设玩家是面朝上坡的方向站立,则: 6 | L表示走到左边的房间, 7 | R表示走到右边的房间, 8 | U表示走到上坡方向的房间, 9 | D表示走到下坡方向的房间。 10 | X星球的居民有点懒,不愿意费力思考。 11 | 他们更喜欢玩运气类的游戏。这个游戏也是如此! 12 | 开始的时候,直升机把100名玩家放入一个个小房间内。 13 | 玩家一定要按照地上的字母移动。 14 | 迷宫地图如下: 15 | 16 | UDDLUULRUL 17 | UURLLLRRRU 18 | RRUURLDLRD 19 | RUDDDDUUUU 20 | URUDLLRRUU 21 | DURLRLDLRL 22 | ULLURLLRDU 23 | RDLULLRDDD 24 | UUDDUDUDLL 25 | ULRDLUURRR 26 | 27 | 请你计算一下,最后,有多少玩家会走出迷宫? 28 | 而不是在里边兜圈子。 29 | 请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容。 30 | """ 31 | 32 | 33 | def dfs(x, y): 34 | """ 35 | 深度搜索 36 | :param x: 位置横坐标 37 | :param y: 位置纵坐标 38 | :return: None 39 | """ 40 | global ans 41 | while True: 42 | """所在(x, y)位置的人按照标识走出迷宫后推出循环""" 43 | # print(x, y) 44 | if x > 9 or x < 0 or y > 9 or y < 0: 45 | ans += 1 46 | # print(ans) 47 | break 48 | 49 | if data_map[x][y] == 1: 50 | break 51 | # 记录走过的位置 52 | data_map[x][y] = 1 53 | 54 | if data[x][y] == 'U': 55 | x -= 1 56 | 57 | elif data[x][y] == 'D': 58 | x += 1 59 | 60 | elif data[x][y] == 'L': 61 | # print(x, y) 62 | y -= 1 63 | 64 | elif data[x][y] == 'R': 65 | y += 1 66 | 67 | 68 | def get_num(): 69 | """ 70 | 获取走出迷宫的人数 71 | :return: 走出迷宫的人数 72 | """ 73 | global data_map 74 | global ans 75 | for i in range(0, 10): 76 | for j in range(0, 10): 77 | """对每个位置进行遍历,注意每次遍历开始前要先对data_map清0""" 78 | # data_map = [[0] * 10] * 10 # 不要用这种方式定义,这样data_map[1][1] = 1 会导致每一行的第一个位置都为1 79 | data_map = [[0] * 10 for _ in range(10)] # 这样行 80 | # print(i, j) 81 | dfs(i, j) 82 | 83 | return ans 84 | 85 | 86 | def get_data(file_name): 87 | """ 88 | 获取数据 89 | :param file_name: 保存数据的文件 90 | :return: 获取的数据 91 | """ 92 | data = [] 93 | with open(file_name, mode='rt', encoding='utf-8') as f: 94 | for line in f: 95 | line = list(line.strip()) 96 | data.append(line) 97 | return data 98 | 99 | 100 | # data_map = [[0] * 10] * 10 # 不要用这种方式定义,这样data_map[1][1] = 1 会导致每一行的第一个位置都为1 101 | data_map = [[0] * 10 for _ in range(10)] # 这样行 102 | # data_map = [[0 for _ in range(10)] for i in range(10)] # 这样也行 103 | # data_map = [] 104 | # for i in range(10): 105 | # data_map.append([0 for i in range(10)]) 106 | data = get_data('../数据/maze2') 107 | ans = 0 108 | 109 | if __name__ == '__main__': 110 | print(get_num()) # 31个人 111 | # dfs(8, 2) 112 | 113 | 114 | -------------------------------------------------------------------------------- /蓝桥真题解析/迷宫.py: -------------------------------------------------------------------------------- 1 | """ 2 | 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。 3 | 010000 4 | 000100 5 | 001001 6 | 110000 7 | 迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 8 | 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 9 | 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 10 | 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 11 | 请注意在字典序中D 0 and map_int[move_node.x][move_node.y - 1] == '0': 76 | queen.append(left(move_node)) 77 | if move_node.y < n - 1 and map_int[move_node.x][move_node.y + 1] == '0': 78 | queen.append(right(move_node)) 79 | if move_node.x > 0 and map_int[move_node.x - 1][move_node.y] == '0': 80 | queen.append(up(move_node)) 81 | 82 | """ 83 | DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR 84 | 广度搜索,最先到满足结束条件的肯定是最短的那一个路径. 85 | """ 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /蓝桥真题解析/植树.py: -------------------------------------------------------------------------------- 1 | """ 2 | 【问题描述】 3 | 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗。 4 | 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n 个。他们准备把自己带的树苗都植下去。 5 | 然而,他们遇到了一个困难:有的树苗比较大,而有的位置挨太近,导致两棵树植下去后会撞在一起。 6 | 他们将树看成一个圆,圆心在他们找的位置上。如果两棵树对应的圆相交,这两棵树就不适合同时植下(相切不受影响),称为两棵树冲突。 7 | 小明和朋友们决定先合计合计,只将其中的一部分树植下去,保证没有互相冲突的树。他们同时希望这些树所能覆盖的面积和(圆面积和)最大。 8 | 【输入格式】 9 | 输入的第一行包含一个整数 n ,表示人数,即准备植树的位置数。 10 | 接下来 n 行,每行三个整数 x, y, r,表示一棵树在空地上的横、纵坐标和半径。 11 | 【输出格式】 12 | 输出一行包含一个整数,表示在不冲突下可以植树的面积和。由于每棵树的面积都是圆周率的整数倍,请输出答案除以圆周率后的值(应当是一个整数)。 13 | 【样例输入】 14 | 6 15 | 1 1 2 16 | 1 4 2 17 | 1 7 2 18 | 4 1 2 19 | 4 4 2 20 | 4 7 2 21 | 【样例输出】 22 | 12 23 | 【评测用例规模与约定】 24 | 对于 30% 的评测用例,1 <= n <= 10; 25 | 对于 60% 的评测用例,1 <= n <= 20; 26 | 对于所有评测用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。 27 | """ 28 | import math 29 | 30 | 31 | class Circle: 32 | """存储每颗树的位置信息,和它的覆盖面积,并提供判断自身与另一颗树的覆盖范围的位置关系""" 33 | def __init__(self, x, y, r): 34 | self.x = x 35 | self.y = y 36 | self.r = r 37 | self.absolute_area = r ** 2 38 | 39 | def judge_relation(self, *args): 40 | """ 41 | 判断两圆之间的关系 42 | @args:多值参数 43 | """ 44 | if args: # args(这里的args就是一个元组)不为空时 45 | flag = [False for i in range(len(args))] 46 | i = 0 47 | for circle in args: 48 | dis = math.sqrt((self.x - circle.x) ** 2 + (self.y - circle.y) ** 2) 49 | if self.r + circle.r < dis or self.r + circle.r == dis: # 外离和外切 50 | """若两个圆属于外切和外离的情况,置flag[i]为真""" 51 | flag[i] = True 52 | i += 1 53 | return flag 54 | else: 55 | # args为空,第一颗树,肯定不会存在与其他树的位置关系情况,直接返回一个元组,因为后边的all()的参数必须为可迭代对象 56 | return [True, ] 57 | 58 | 59 | class PlantTree: 60 | def __init__(self, n): 61 | self.n = n # 待植的树的棵数 62 | self.tree = [0 for i in range(n)] # 存放每一颗树的位置信息 63 | self.vis = [] # 存放已经种植的树 64 | self.total_area = 0 # 已经种植的树覆盖的总面积 65 | 66 | def init(self): 67 | for i in range(self.n): 68 | x, y, r = list(map(int, input().split())) 69 | self.tree[i] = Circle(x, y, r) 70 | self.tree.sort(key=lambda circle: circle.r, reverse=True) # 半径从大到小排序,覆盖面积最大的先种 71 | 72 | def plant(self): 73 | for i in range(self.n): 74 | # flag = all(self.tree[i].judge_relation(*self.vis)) 75 | if all(self.tree[i].judge_relation(*self.vis)): 76 | """注意all()的参数必须是可迭代对象,vis是一个列表用*打散传入""" 77 | # 如果当前树与已种的树不会相交,则把此树放入已种树的列表。 78 | self.vis.append(self.tree[i]) 79 | self.total_area += self.tree[i].absolute_area 80 | return self.total_area 81 | 82 | 83 | def main(): 84 | n = int(input()) 85 | plant_tree = PlantTree(n) 86 | plant_tree.init() 87 | plant_tree.plant() 88 | print(plant_tree.total_area) 89 | 90 | 91 | if __name__ == '__main__': 92 | main() 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /蓝桥真题解析/test.py: -------------------------------------------------------------------------------- 1 | # gen = map(int, input().split()) 2 | # print(next(gen)) 3 | # print(next(gen)) 4 | # print(next(gen)) 5 | # print(next(gen)) 6 | # print(next(gen)) 7 | 8 | # dif = 5 9 | # new_dif = 8 10 | # dif = new_dif if new_dif < dif else dif 11 | # print(dif) 12 | # 13 | # lst = [1, 3, 5, 7, 9] 14 | # print(min(lst), max(lst)) 15 | 16 | # l1 = [22, 33, 1, 2, 7, 4] 17 | # # l2 = sorted(l1) 18 | # # print(l1, l2) 19 | # 20 | # l1.sort() 21 | # print(l1) # [1, 2, 4, 7, 22, 33] 返回值为None 把原来的列表元素从小到大排序,改变原列表内容 22 | # l2 = [('太白',18), ('alex', 73), ('wusir', 35), ('口天吴', 41)] 23 | # l2.sort(key=lambda x: x[1]) 24 | # # print(l2) # [('太白', 18), ('wusir', 35), ('口天吴', 41), ('alex', 73)] 25 | # l2.sort(key=lambda x: x[1], reverse=True) 26 | # print(l2) # [('alex', 73), ('口天吴', 41), ('wusir', 35), ('太白', 18)] 27 | # 28 | # def gcd(a, b): 29 | # 30 | # while b != 0: 31 | # c = a % b 32 | # a = b 33 | # b = c 34 | # 35 | # return a 36 | # 37 | # 38 | # molecule = 0 39 | # 40 | # for i in range(20): 41 | # molecule += 2 ** i 42 | # 43 | # gc = gcd(molecule, 2 ** 19) 44 | # 45 | # print(molecule // gc,'/',2 ** 19 // gc, sep='') 46 | # a, b = divmod(10, 3) 47 | # # print(a, b) 48 | # s = ' a sa da ss daas' 49 | # print(s) 50 | # print(s.strip()) 51 | # # strip:空白:空格,\t,\n 52 | # s = ' \n太白\t' 53 | # # print(s) 54 | # print(s.strip()) 55 | # from fnmatch import fnmatchcase as match 56 | # 57 | # print(match('88折', '*折')) 58 | 59 | # for i in range(2, 3): 60 | # print(i) 61 | 62 | # a = [1, 2, 4] 63 | # a.insert(0,0) 64 | # print(a) 65 | # num_list = [[0] * 5 for i in range(2)] 66 | # 67 | # print(num_list) 68 | # num_list[0][0] = 1 69 | # print(num_list) 70 | # data_map = [[0] * 10 for _ in range(10)] 71 | # data_map = [[0] * 10] * 10 # 不要用这种方式定义,这样data_map[1][1] = 1 会导致每一行的第一个位置都为1 72 | # data_map=[] 73 | # for i in range(10): 74 | # data_map.append([0 for i in range(10)]) 75 | # data_map[1][0] = 1 76 | # print(data_map) 77 | 78 | # def func(*args): 79 | # print(args) 80 | # if not args: 81 | # return True 82 | # 83 | # print(func(*[])) 84 | 85 | # flag = [True, True, True] 86 | # 87 | # print(all(flag)) 88 | 89 | # a = [0, 1, 3, 5] 90 | # for i in range(3, -1, -1): 91 | # print(a[i]) 92 | # def func(x): 93 | # global a 94 | # a += 8 95 | # c = x + a 96 | # return c 97 | # 98 | # a = 3 99 | # print(func(3)) 100 | # score = [1,2,3] 101 | # for i in [1,2,3,4]: 102 | # if i == 2: 103 | # print(i) 104 | # # if i == 3: 105 | # # print(2) 106 | # break 107 | # else: 108 | # # for s in score: 109 | # # if s == 0: 110 | # # continue 111 | # # score[score.index(s)] -= 1 112 | # print('ss') 113 | # 114 | # # print(score) 115 | # s = set() 116 | # s1 = set() 117 | # s.add(1) 118 | # s1.add(2) 119 | # r = [s, s1] 120 | # 121 | # for i in r: 122 | # i.add(9) 123 | # print(r) 124 | # import copy 125 | # # 深copy()后得到的对象改变后不会改变原来对象的内容 126 | # s = set() 127 | # for i in range(4): 128 | # s.add(i) 129 | # print(s) 130 | # a = copy.deepcopy(s) 131 | # a.add(8) 132 | # print(a) 133 | # print(s) 134 | # lst = [i for i in range(10)] 135 | # print(sum(lst[3:])) 136 | # print(sum(lst[3:-1])) 137 | line = '1 2 3 4 50' 138 | line = line.split() 139 | print(line) 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /蓝桥真题解析/购物单.py: -------------------------------------------------------------------------------- 1 | """ 2 | 标题: 购物单 3 | 4 | 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。 5 | 老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。 6 | 7 | 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。 8 | 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。 9 | 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。 10 | 11 | 取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。 12 | 你的任务是计算出,小明最少需要取多少现金。 13 | 以下是让人头疼的购物单,为了保护隐私,``物品名称被隐藏了。 14 | 15 | **** 180.90 88折 16 | **** 10.25 65折 17 | **** 56.14 9折 18 | **** 104.65 9折 19 | **** 100.30 88折 20 | **** 297.15 半价 21 | **** 26.75 65折 22 | **** 130.62 半价 23 | **** 240.28 58折 24 | **** 270.62 8折 25 | **** 115.87 88折 26 | **** 247.34 95折 27 | **** 73.21 9折 28 | **** 101.00 半价 29 | **** 79.54 半价 30 | **** 278.44 7折 31 | **** 199.26 半价 32 | **** 12.97 9折 33 | **** 166.30 78折 34 | **** 125.50 58折 35 | **** 84.98 9折 36 | **** 113.35 68折 37 | **** 166.57 半价 38 | **** 42.56 9折 39 | **** 81.90 95折 40 | **** 131.78 8折 41 | **** 255.89 78折 42 | **** 109.17 9折 43 | **** 146.69 68折 44 | **** 139.33 65折 45 | **** 141.16 78折 46 | **** 154.74 8折 47 | **** 59.42 8折 48 | **** 85.44 68折 49 | **** 293.70 88折 50 | **** 261.79 65折 51 | **** 11.30 88折 52 | **** 268.27 58折 53 | **** 128.29 88折 54 | **** 251.03 8折 55 | **** 208.39 75折 56 | **** 128.88 75折 57 | **** 62.06 9折 58 | **** 225.87 75折 59 | **** 12.89 75折 60 | **** 34.28 75折 61 | **** 62.16 58折 62 | **** 129.12 半价 63 | **** 218.37 半价 64 | **** 289.69 8折 65 | 66 | 需要说明的是,88折指的是按标价的88%计算,而8折是按80%计算,余者类推。 67 | 特别地,半价是按50%计算。 68 | 69 | 请提交小明要从取款机上提取的金额,单位是元。 70 | 答案是一个整数,类似4300的样子,结尾必然是00,不要填写任何多余的内容。 71 | 72 | 特别提醒:不许携带计算器入场,也不能打开手机。 73 | """ 74 | import math 75 | from fnmatch import fnmatchcase as match 76 | """ 77 | 这个求解方式很装逼, 78 | 但是, 79 | 蓝桥杯不允许导入第三方库, 80 | 又但是, 81 | 蓝桥杯是可以用python的标准库的, 82 | math是python标准库可以用,fnmatch我上网查貌似也是python的标准库。 83 | 我不确定,有兴趣的小伙伴们可以取查一下。 84 | 所以大家知道导库解决更容易就行了。 85 | 实锤: 86 | fnmatch.fnmatchcase(filename, pattern) 87 | Test whether filename matches pattern, returning True or False; 88 | the comparison is case-sensitive and does not apply os.path.normcase(). 89 | 官方文档可查,fnmatch也是python标准库,蓝桥可以使用。 90 | 本题完全可以使用这种方法。 91 | 此外, 92 | 本方法也可以不加库, 93 | 把match(new_line[-1], '?折')改为new_line[-1]去掉'折'后判断剩余new_line[-1]字符串的长度, 94 | 为1则 time = int(new_line[-1][:-1]) * 0.1 95 | 为2则 time = int(new_line[-1][:-1]) * 0.01 96 | 普通应试解法参考链接: 97 | https://blog.csdn.net/qq_31910669/article/details/103641497 98 | 在目录中选购物单即为本题目应试解法。 99 | 此方法需要用记事本先对数据进行格式化处理。 100 | """ 101 | 102 | 103 | def get_prices(file_name): 104 | prices = 0 105 | with open(file_name, mode='rt', encoding='utf-8') as f: 106 | info = f.readlines() 107 | for line in info: 108 | new_line = line.split() 109 | time = 0 110 | if new_line[-1] == '半价': 111 | time = 0.5 112 | elif match(new_line[-1], '?折'): 113 | time = int(new_line[-1][:-1]) * 0.1 114 | elif match(new_line[-1], '*折'): 115 | time = int(new_line[-1][:-1]) * 0.01 116 | prices += float(new_line[1]) * time 117 | 118 | return math.ceil(prices / 100) * 100 119 | 120 | 121 | if __name__ == '__main__': 122 | print(get_prices('../数据/com_info')) # 5200 123 | 124 | 125 | """ 126 | 注释: 127 | 1. fnmatch模块 128 | fnmatch模块下的fnmatchcase方法 129 | fnmatchcase(匹配目标字符串, 需要匹配的通配符字符串) 130 | * 匹配多个 131 | ? 匹配一个 132 | 可以匹配返回True 133 | 否则返回False 134 | 2. math模块(math库蓝桥考试可以用,属于python的标准库) 135 | math模块下的ceil(x)方法:向上取整,x为500.45则返回501 136 | math模块下的floor(x)方法:向下取整,x为500.45则返回500 137 | """ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 蓝桥刷题 2 | 3 | > 原文链接: 4 | > [https://github.com/libo-sober/LanQiaoCup](https://github.com/libo-sober/LanQiaoCup) 5 | > [Python解答蓝桥杯省赛真题之从入门到真题](https://blog.csdn.net/qq_31910669/article/details/103641497) 6 | 7 | 8 | 1. 不同字串 9 | 10 | ```python 11 | """ 12 | 一个字符串的非空子串是指字符串中长度至少为1 13 | 的连续的一段字符组成的串。例如,字符串aaab 14 | 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 15 | 7个。 注意在计算时,只算本质不同的串的个数。 16 | 17 | 请问,字符串0100110001010001 18 | 有多少个不同的非空子串? 19 | 20 | 这是一道结果填空的题,你只需要算出结果后提交即可。 21 | 本题的结果为一 个整数,在提交答案时只填写这个整数, 22 | 填写多余的内容将无法得分。 23 | """ 24 | 25 | s = '0100110001010001' 26 | # s = 'aaab' 27 | sep = 1 # 连续的sep个字符的子串 28 | count = 0 29 | set1 = set() # 空集合,利用集合的不重复性 30 | while sep <= len(s): 31 | set1.add(s[0:sep]) 32 | for i in range(len(s) - sep): 33 | set1.add(s[i+1:i+sep+1]) # 集合自动去掉重复的 34 | sep += 1 35 | count += len(set1) # 去重后的个数 36 | print(set1) 37 | set1.clear() 38 | print(count) 39 | # {'b', 'a'} 40 | # {'ab', 'aa'} 41 | # {'aab', 'aaa'} 42 | # 7 43 | # 44 | # {'1', '0'} 45 | # {'10', '11', '01', '00'} 46 | # {'110', '000', '010', '100', '001', '011', '101'} 47 | # {'0101', '0110', '0010', '0001', '1100', '1001', '0011', '1010', '1000', '0100'} 48 | # {'00101', '00010', '11000', '01001', '00110', '01010', '01100', '10011', '10001', '01000', '10100'} 49 | # {'010011', '000101', '001100', '001010', '101000', '010100', '100010', '100110', '010001', '011000', '110001'} 50 | # {'0011000', '0101000', '1000101', '0001010', '1010001', '1001100', '0010100', '1100010', '0110001', '0100110'} 51 | # {'00010100', '10011000', '10001010', '00110001', '11000101', '00101000', '01001100', '01100010', '01010001'} 52 | # {'000101000', '011000101', '110001010', '001010001', '010011000', '001100010', '100110001', '100010100'} 53 | # {'1000101000', '0100110001', '1001100010', '0110001010', '0011000101', '1100010100', '0001010001'} 54 | # {'10011000101', '10001010001', '11000101000', '01001100010', '00110001010', '01100010100'} 55 | # {'011000101000', '001100010100', '010011000101', '100110001010', '110001010001'} 56 | # {'0011000101000', '1001100010100', '0100110001010', '0110001010001'} 57 | # {'01001100010100', '10011000101000', '00110001010001'} 58 | # {'010011000101000', '100110001010001'} 59 | # {'0100110001010001'} 60 | # 100 61 | 62 | # 直接提交100即可 63 | ``` 64 | 65 | 2. 年号字串 66 | 67 | ```python 68 | """ 69 | 小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27 70 | 以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对 71 | 应28,AZ 对应52,LQ 对应329。 72 | 请问2019 对应的字符串是什么? 73 | """ 74 | # # 进制转换一般都是用除K取余法 75 | # num = 2019 76 | # print(num % 26, num // 26) 77 | # print(77 % 26, 77 // 26) 78 | # print(2 % 26, 2 // 26) 79 | # print(chr(ord('A') + 17 - 1)) 80 | # print(chr(ord('A') + 25 - 1)) 81 | # print(chr(ord('A') + 2 - 1)) 82 | # # BYQ 83 | # # 验算 84 | # # LQ 329 85 | # print(ord('Q')-ord('A')+1 + (ord('L')-ord('A')+1) * 26) # 329 86 | # # BYQ 2019 87 | # print(ord('Q')-ord('A')+1 + (ord('Y')-ord('A')+1) * 26 + (ord('B')-ord('A')+1) * 26 ** 2) # 2019 88 | # # 所以提交BYQ 89 | # 90 | # # 2019 转成16进制 91 | # # print(2019 % 16, 2019 // 16) 92 | # # print(126 % 16, 126 // 16) 93 | # # print(3 + 14 * 16 + 7 * 16 ** 2) 94 | # # 7E3 95 | 96 | # 最后整理一下代码 97 | year = 2019 98 | lst = [] 99 | while year != 0: 100 | lst.append(chr(ord('A') + year % 26 - 1)) 101 | year = year // 26 102 | # reversed(lst) 103 | lst.reverse() 104 | print(*lst) # B Y Q 105 | ``` 106 | 107 | 3. 数列求值 108 | 109 | ```python 110 | """ 111 | 【问题描述】 112 | 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。 113 | 求第 20190324 项的最后 4 位数字。 114 | 【答案提交】 115 | 这是一道结果填空的题,你只需要算出结果后提交即可。 116 | 本题的结果为一个 4 位整数(提示:答案的千位不为 0), 117 | 在提交答案时只填写这个整数,填写多余的内容将无法得分。 118 | """ 119 | # 本来想考虑用生成器来做,以达到节省内存的效果。 120 | # 但是尝试了一下发现不太行。 121 | # 有哪位大神可以解决吗? 122 | # 望分享。 123 | lst = [1, 1, 1] 124 | for i in range(3, 20190324): 125 | lst.append((lst[i-3] + lst[i-2] + lst[i-1]) % 10000) 126 | print(lst[-1]) # 4659 127 | ``` 128 | 129 | 4. 数的分解 130 | 131 | ```python 132 | """ 133 | 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法? 134 | 135 | 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。 136 | 137 | 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 138 | 139 | """ 140 | 141 | 142 | def check(x): 143 | while x != 0: 144 | a = x % 10 145 | if a == 2 or a == 4: 146 | return True 147 | x = x // 10 148 | return False 149 | 150 | 151 | num = 2019 152 | lst = [] 153 | for i in range(1, num + 1): 154 | if check(i): 155 | continue 156 | for j in range(i + 1, num - i + 1): 157 | if check(j): 158 | continue 159 | for k in range(j + 1, num - i - j + 1): 160 | if check(k): 161 | continue 162 | if i + j + k == num: 163 | lst.append([i, j, k]) 164 | # print(lst) 165 | print(len(lst)) 166 | # 40785 167 | ``` 168 | 169 | 5. 特别数的和 170 | 171 | ```python 172 | """ 173 | 小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0), 174 | 在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个, 175 | 他们的和是 574。 请问,在 1 到 n 中,所有这样的数的和是多少? 176 | 177 | 输入一行包含一个整数 n。 178 | 179 | 输出一行,包含一个整数,表示满足条件的数的和。 180 | 181 | 【样例输入】 182 | 183 | 40 184 | 【样例输出】 185 | 186 | 574 187 | 188 | 对于 20% 的评测用例,1≤n≤10。 189 | 对于 50% 的评测用例,1≤n≤100。 190 | 对于 80% 的评测用例,1≤n≤1000。 191 | 对于所有评测用例,1≤n≤10000。 192 | """ 193 | 194 | n = int(input()) 195 | num = 0 196 | for i in range(1, n + 1): 197 | a = i 198 | while a != 0: 199 | b = a % 10 200 | if b in [2, 0, 1, 9]: 201 | num += i 202 | break 203 | a = a // 10 204 | print(num) 205 | # 10000 206 | # 41951713 207 | # 数据规模不大,直接暴力求解 208 | ``` 209 | 210 | 6. 迷宫 211 | 212 | ```python 213 | """ 214 | 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。 215 | 010000 216 | 000100 217 | 001001 218 | 110000 219 | 迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 220 | 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 221 | 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 222 | 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 223 | 请注意在字典序中D 0 and map_int[move_node.x][move_node.y - 1] == '0': 285 | queen.append(left(move_node)) 286 | if move_node.y < n - 1 and map_int[move_node.x][move_node.y + 1] == '0': 287 | queen.append(right(move_node)) 288 | if move_node.x > 0 and map_int[move_node.x - 1][move_node.y] == '0': 289 | queen.append(up(move_node)) 290 | 291 | """ 292 | 广度搜索,最先到满足结束条件的肯定是最短的那一个路径. 293 | """ 294 | ``` 295 | 296 | 7. 完全二叉树的和 297 | 298 | ```python 299 | """ 300 | 给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值, 301 | 按从上到下、从左到右的顺序依次是 A1, A2, · · · AN,如下图所示: 302 | 303 | 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大? 304 | 如果有多个深度的权值和同为最大,请你输出其中最小的深度。 305 | 306 | 注:根的深度是 1。 307 | 308 | 第一行包含一个整数 N。 309 | 第二行包含 N 个整数 A1, A2, · · · AN 。 310 | 311 | 输出一个整数代表答案 312 | 313 | 7 314 | 1 6 5 4 3 2 1 315 | 316 | 2 317 | """ 318 | 319 | 320 | def get_deep(): 321 | n = int(input()) 322 | lst = list(map(int, input().split())) 323 | deep = 1 324 | while 2 ** deep - 1 <= n: 325 | lst[deep - 1] = sum(lst[2 ** (deep - 1) - 1:2 ** deep - 1]) 326 | deep += 1 327 | if 2 ** (deep - 1) - 1 < n: 328 | lst[deep - 1] = sum(lst[2 ** (deep - 1) - 1:]) 329 | return lst.index(max(lst)) + 1 330 | 331 | 332 | if __name__ == '__main__': 333 | print(get_deep()) 334 | 335 | 336 | """ 337 | 注释: 338 | 1. map(int, input().split()) 339 | 这产生的是一个生成器, next一次会得到一个值 340 | list可以全部结收生成器中的值并返回一个列表 341 | gen = map(int, input().split()) 342 | print(next(gen)) 343 | print(next(gen)) 344 | print(next(gen)) 345 | print(next(gen)) 346 | print(next(gen)) 347 | 348 | 1 6 5 4 3 2 1 349 | 1 350 | 6 351 | 5 352 | 4 353 | 3 354 | 2. 完全二叉树的特性 355 | 每一层的结点数:2 ** deep 356 | 满二叉树的总结点数:2 ** deep - 1 357 | 3. lst.index(a) 358 | 返回值为列表中最先出现a的索引值 359 | 加1后在此就是a对应的最小深度 360 | """ 361 | ``` 362 | 363 | 8. 等差数列 364 | 365 | ```python 366 | """ 367 | 试题 H: 等差数列 368 | 时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分 369 | 【问题描述】 370 | 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 371 | 部分的数列,只记得其中 N 个整数。 372 | 现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有 373 | 几项? 374 | 【输入格式】 375 | 输入的第一行包含一个整数 N。 376 | 第二行包含 N 个整数 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ∼ A N 并不一定是按等差数 377 | 列中的顺序给出) 378 | 【输出格式】 379 | 输出一个整数表示答案。 380 | 【样例输入】 381 | 382 | 5 383 | 2 6 4 10 20 384 | 【样例输出】 385 | 10 386 | 【样例说明】 387 | 包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 388 | 18、20。 389 | 390 | 【评测用例规模与约定】 391 | 对于所有评测用例,2 ≤ N ≤ 100000,0 ≤ A i ≤ 10^ 9 。 392 | """ 393 | 394 | 395 | def get_len(): 396 | n = int(input()) 397 | lst = list(map(int, input().split())) 398 | count = 1 399 | lst.sort() 400 | num = lst[0] 401 | dif = lst[1] - lst[0] 402 | for i in range(2, n): 403 | new_dif = lst[i] - lst[i - 1] 404 | dif = new_dif if new_dif < dif else dif 405 | while num < lst[-1]: 406 | num += dif 407 | count += 1 408 | return count 409 | 410 | 411 | if __name__ == '__main__': 412 | print(get_len()) 413 | 414 | """ 415 | 注释: 416 | 1. sorted 排序 417 | l1 = [22, 33, 1, 2, 7, 4] 418 | l2 = sorted(l1) 419 | # print(l1) # [22, 33, 1, 2, 7, 4] 不会改变原来的数组内容 420 | # print(l2) # [1, 2, 4, 7, 22, 33] 421 | l2 = [('太白',18), ('alex', 73), ('wusir', 35), ('口天吴', 41)] 422 | print(sorted(l2)) # [('alex', 73), ('wusir', 35), ('口天吴', 41), ('太白', 18)] 423 | print(sorted(l2, key=lambda x:x[1])) # 返回的是一个列表 [('太白', 18), ('wusir', 35), ('口天吴', 41), ('alex', 73)] 424 | print(sorted(l2, key=lambda x:x[1], reverse=True)) # 从大到小 425 | 426 | 427 | 2. 列表的sort()方法排序 428 | l1.sort() 429 | print(l1) # [1, 2, 4, 7, 22, 33] 返回值为None 把原来的列表元素从小到大排序,改变原列表内容 430 | l2 = [('太白',18), ('alex', 73), ('wusir', 35), ('口天吴', 41)] 431 | l2.sort(key=lambda x: x[1]) 432 | # print(l2) # [('太白', 18), ('wusir', 35), ('口天吴', 41), ('alex', 73)] 433 | l2.sort(key=lambda x: x[1], reverse=True) 434 | print(l2) # [('alex', 73), ('口天吴', 41), ('wusir', 35), ('太白', 18)] # 从大到小 435 | 436 | """ 437 | ``` 438 | 439 | 9. 换钞票 440 | 441 | ```python 442 | """ 443 | x星球的钞票的面额只有:100元,5元,2元,1元,共4种。 444 | 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。 445 | 小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍, 446 | 剩下的当然都是5元面额的。 447 | 448 | 银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗? 449 | (5元,2元,1元面额的必须都有,不能是0) 450 | 451 | 注意,需要提交的是一个整数,不要填写任何多余的内容。 452 | """ 453 | 454 | 455 | def change_money(): 456 | money = 200 457 | lst = [] 458 | for i in range(1, 10): 459 | if (money - i - 2 * i * 10) % 5 == 0: 460 | lst.append(i + i * 10 + (money - i - 2 * i * 10) // 5) 461 | 462 | return min(lst) 463 | 464 | 465 | if __name__ == '__main__': 466 | print(change_money()) 467 | 468 | """ 469 | 结果为74 470 | 471 | 其实本题的解就一个,就为74. 472 | """ 473 | ``` 474 | 475 | 10. 分数 476 | 477 | ```python 478 | """ 479 | 标题:分数 480 | 481 | 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + … 482 | 每项是前一项的一半,如果一共有20项, 483 | 求这个和是多少,结果用分数表示出来。 484 | 类似: 485 | 3/2 486 | 当然,这只是加了前2项而已。分子分母要求互质。 487 | 488 | 注意: 489 | 需要提交的是已经约分过的分数,中间任何位置不能含有空格。 490 | 请不要填写任何多余的文字或符号 491 | """ 492 | 493 | 494 | def gcd(a, b): 495 | while a % b != 0: 496 | c = a % b 497 | a = b 498 | b = c 499 | return c 500 | 501 | 502 | def get_num(n): 503 | fenzi = 0 504 | fenmu = 2 ** (n - 1) 505 | for i in range(n): 506 | fenzi += 2 ** i 507 | mcf = gcd(fenmu, fenzi) 508 | 509 | return f'{fenzi // mcf}/{fenmu // mcf}' 510 | 511 | 512 | if __name__ == '__main__': 513 | print(get_num(20)) # 1048575/524288 514 | # print(gcd(20, 35)) # 5 515 | ``` 516 | 517 | 11. 购物单 518 | 519 | ```python 520 | """ 521 | 标题: 购物单 522 | 523 | 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。 524 | 老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。 525 | 526 | 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。 527 | 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。 528 | 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。 529 | 530 | 取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。 531 | 你的任务是计算出,小明最少需要取多少现金。 532 | 以下是让人头疼的购物单,为了保护隐私,``物品名称被隐藏了。 533 | 534 | **** 180.90 88折 535 | **** 10.25 65折 536 | **** 56.14 9折 537 | **** 104.65 9折 538 | **** 100.30 88折 539 | **** 297.15 半价 540 | **** 26.75 65折 541 | **** 130.62 半价 542 | **** 240.28 58折 543 | **** 270.62 8折 544 | **** 115.87 88折 545 | **** 247.34 95折 546 | **** 73.21 9折 547 | **** 101.00 半价 548 | **** 79.54 半价 549 | **** 278.44 7折 550 | **** 199.26 半价 551 | **** 12.97 9折 552 | **** 166.30 78折 553 | **** 125.50 58折 554 | **** 84.98 9折 555 | **** 113.35 68折 556 | **** 166.57 半价 557 | **** 42.56 9折 558 | **** 81.90 95折 559 | **** 131.78 8折 560 | **** 255.89 78折 561 | **** 109.17 9折 562 | **** 146.69 68折 563 | **** 139.33 65折 564 | **** 141.16 78折 565 | **** 154.74 8折 566 | **** 59.42 8折 567 | **** 85.44 68折 568 | **** 293.70 88折 569 | **** 261.79 65折 570 | **** 11.30 88折 571 | **** 268.27 58折 572 | **** 128.29 88折 573 | **** 251.03 8折 574 | **** 208.39 75折 575 | **** 128.88 75折 576 | **** 62.06 9折 577 | **** 225.87 75折 578 | **** 12.89 75折 579 | **** 34.28 75折 580 | **** 62.16 58折 581 | **** 129.12 半价 582 | **** 218.37 半价 583 | **** 289.69 8折 584 | 585 | 需要说明的是,88折指的是按标价的88%计算,而8折是按80%计算,余者类推。 586 | 特别地,半价是按50%计算。 587 | 588 | 请提交小明要从取款机上提取的金额,单位是元。 589 | 答案是一个整数,类似4300的样子,结尾必然是00,不要填写任何多余的内容。 590 | 591 | 特别提醒:不许携带计算器入场,也不能打开手机。 592 | """ 593 | import math 594 | from fnmatch import fnmatchcase as match 595 | """ 596 | 这个求解方式很装逼, 597 | 但是, 598 | 蓝桥杯不允许导入第三方库, 599 | 又但是, 600 | 蓝桥杯是可以用python的标准库的, 601 | math是python标准库可以用,fnmatch我上网查貌似也是python的标准库。 602 | 我不确定,有兴趣的小伙伴们可以取查一下。 603 | 所以大家知道导库解决更容易就行了。 604 | 实锤: 605 | fnmatch.fnmatchcase(filename, pattern) 606 | Test whether filename matches pattern, returning True or False; 607 | the comparison is case-sensitive and does not apply os.path.normcase(). 608 | 官方文档可查,fnmatch也是python标准库,蓝桥可以使用。 609 | 本题完全可以使用这种方法。 610 | 此外, 611 | 本方法也可以不加库, 612 | 把match(new_line[-1], '?折')改为new_line[-1]去掉'折'后判断剩余new_line[-1]字符串的长度, 613 | 为1则 time = int(new_line[-1][:-1]) * 0.1 614 | 为2则 time = int(new_line[-1][:-1]) * 0.01 615 | 普通应试解法参考链接: 616 | https://blog.csdn.net/qq_31910669/article/details/103641497 617 | 在目录中选购物单即为本题目应试解法。 618 | 此方法需要用记事本先对数据进行格式化处理。 619 | """ 620 | 621 | 622 | def get_prices(file_name): 623 | prices = 0 624 | with open(file_name, mode='rt', encoding='utf-8') as f: 625 | info = f.readlines() 626 | for line in info: 627 | new_line = line.split() 628 | time = 0 629 | if new_line[-1] == '半价': 630 | time = 0.5 631 | elif match(new_line[-1], '?折'): 632 | time = int(new_line[-1][:-1]) * 0.1 633 | elif match(new_line[-1], '*折'): 634 | time = int(new_line[-1][:-1]) * 0.01 635 | prices += float(new_line[1]) * time 636 | 637 | return math.ceil(prices / 100) * 100 638 | 639 | 640 | if __name__ == '__main__': 641 | print(get_prices('数据/com_info')) # 5200 642 | 643 | 644 | """ 645 | 注释: 646 | 1. fnmatch模块 647 | fnmatch模块下的fnmatchcase方法 648 | fnmatchcase(匹配目标字符串, 需要匹配的通配符字符串) 649 | * 匹配多个 650 | ? 匹配一个 651 | 可以匹配返回True 652 | 否则返回False 653 | 2. math模块(math库蓝桥考试可以用,属于python的标准库) 654 | math模块下的ceil(x)方法:向上取整,x为500.45则返回501 655 | math模块下的floor(x)方法:向下取整,x为500.45则返回500 656 | """ 657 | ``` 658 | 659 | 12. 等差素数列 660 | 661 | ```python 662 | """ 663 | 难度系数:*** 664 | 665 | 2,3,5,7,11,13,…是素数序列。 666 | 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。 667 | 上边的数列公差为30,长度为6。 668 | 669 | 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 670 | 这是数论领域一项惊人的成果! 671 | 672 | 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 673 | 674 | 长度为10的等差素数列,其公差最小值是多少? 675 | 676 | 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。 677 | """ 678 | 679 | 680 | def init_num(): 681 | global tot 682 | for i in range(2, N): 683 | if dp[i] == 1: 684 | continue 685 | prim[tot] = i # 记录N以内的所有素数 686 | tot += 1 687 | j = i 688 | while i * j < N: 689 | dp[i * j] = 1 # 不是素数的位置标记1 690 | j += 1 691 | 692 | 693 | def get_dif(): 694 | global dif 695 | init_num() 696 | 697 | # print(dp[:100]) 698 | # print(prim[:100]) 699 | 700 | # print(tot) 701 | 702 | while dif * 10 < N: 703 | for j in range(tot): 704 | flag, temp = True, prim[j] 705 | for k in range(1, 10): # temp后边是否再有9个满足等差条件的素数 706 | if temp + dif >= N or dp[temp + dif] == 1: 707 | flag = False 708 | break 709 | else: 710 | temp += dif 711 | if flag: 712 | # print(dif, prim[j]) 713 | return dif 714 | dif += 1 715 | 716 | 717 | N = 1000010 718 | dp = [1, 1] + [0] * N 719 | tot = 0 720 | dif = 1 721 | prim = [0] * N 722 | 723 | if __name__ == '__main__': 724 | # print(is_prime(2)) 725 | print(get_dif()) 726 | ``` 727 | 728 | 13. 迷宫2 729 | 730 | ```python 731 | """ 732 | X星球的一处迷宫游乐场建在某个小山坡上。 733 | 它是由10x10相互连通的小房间组成的。 734 | 房间的地板上写着一个很大的字母。 735 | 我们假设玩家是面朝上坡的方向站立,则: 736 | L表示走到左边的房间, 737 | R表示走到右边的房间, 738 | U表示走到上坡方向的房间, 739 | D表示走到下坡方向的房间。 740 | X星球的居民有点懒,不愿意费力思考。 741 | 他们更喜欢玩运气类的游戏。这个游戏也是如此! 742 | 开始的时候,直升机把100名玩家放入一个个小房间内。 743 | 玩家一定要按照地上的字母移动。 744 | 迷宫地图如下: 745 | 746 | UDDLUULRUL 747 | UURLLLRRRU 748 | RRUURLDLRD 749 | RUDDDDUUUU 750 | URUDLLRRUU 751 | DURLRLDLRL 752 | ULLURLLRDU 753 | RDLULLRDDD 754 | UUDDUDUDLL 755 | ULRDLUURRR 756 | 757 | 请你计算一下,最后,有多少玩家会走出迷宫? 758 | 而不是在里边兜圈子。 759 | 请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容。 760 | """ 761 | 762 | 763 | def dfs(x, y): 764 | """ 765 | 深度搜索 766 | :param x: 位置横坐标 767 | :param y: 位置纵坐标 768 | :return: None 769 | """ 770 | global ans 771 | while True: 772 | """所在(x, y)位置的人按照标识走出迷宫后推出循环""" 773 | # print(x, y) 774 | if x > 9 or x < 0 or y > 9 or y < 0: 775 | ans += 1 776 | # print(ans) 777 | break 778 | 779 | if data_map[x][y] == 1: 780 | break 781 | # 记录走过的位置 782 | data_map[x][y] = 1 783 | 784 | if data[x][y] == 'U': 785 | x -= 1 786 | 787 | elif data[x][y] == 'D': 788 | x += 1 789 | 790 | elif data[x][y] == 'L': 791 | # print(x, y) 792 | y -= 1 793 | 794 | elif data[x][y] == 'R': 795 | y += 1 796 | 797 | 798 | def get_num(): 799 | """ 800 | 获取走出迷宫的人数 801 | :return: 走出迷宫的人数 802 | """ 803 | global data_map 804 | global ans 805 | for i in range(0, 10): 806 | for j in range(0, 10): 807 | """对每个位置进行遍历,注意每次遍历开始前要先对data_map清0""" 808 | # data_map = [[0] * 10] * 10 # 不要用这种方式定义,这样data_map[1][1] = 1 会导致每一行的第一个位置都为1 809 | data_map = [[0] * 10 for _ in range(10)] # 这样行 810 | # print(i, j) 811 | dfs(i, j) 812 | 813 | return ans 814 | 815 | 816 | def get_data(file_name): 817 | """ 818 | 获取数据 819 | :param file_name: 保存数据的文件 820 | :return: 获取的数据 821 | """ 822 | data = [] 823 | with open(file_name, mode='rt', encoding='utf-8') as f: 824 | for line in f: 825 | line = list(line.strip()) 826 | data.append(line) 827 | return data 828 | 829 | 830 | # data_map = [[0] * 10] * 10 # 不要用这种方式定义,这样data_map[1][1] = 1 会导致每一行的第一个位置都为1 831 | data_map = [[0] * 10 for _ in range(10)] # 这样行 832 | # data_map = [[0 for _ in range(10)] for i in range(10)] # 这样也行 833 | # data_map = [] 834 | # for i in range(10): 835 | # data_map.append([0 for i in range(10)]) 836 | data = get_data('数据/maze2') 837 | ans = 0 838 | 839 | if __name__ == '__main__': 840 | print(get_num()) # 31个人 841 | # dfs(8, 2) 842 | ``` 843 | 844 | 14. 承压计算 845 | 846 | ```python 847 | """ 848 | X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。 849 | 850 | 每块金属原料的外形、尺寸完全一致,但重量不同。 851 | 金属材料被严格地堆放成金字塔形。 852 | 853 | 7 854 | 5 8 855 | 7 8 8 856 | 9 2 7 2 857 | 8 1 4 9 1 858 | 8 1 8 8 4 1 859 | 7 9 6 1 4 5 4 860 | 5 6 5 5 6 9 5 6 861 | 5 5 4 7 9 3 5 5 1 862 | 7 5 7 9 7 4 7 3 3 1 863 | 4 6 4 5 5 8 8 3 2 4 3 864 | 1 1 3 3 1 6 6 5 5 4 4 2 865 | 9 9 9 2 1 9 1 9 2 9 5 7 9 866 | 4 3 3 7 7 9 3 6 1 3 8 8 3 7 867 | 3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 868 | 8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 869 | 8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 870 | 2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 871 | 7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 872 | 9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 873 | 5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 874 | 6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 875 | 2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 876 | 7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 877 | 1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 878 | 2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 879 | 7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9 880 | 7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6 881 | 5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1 882 | X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 883 | 884 | 其中的数字代表金属块的重量(计量单位较大)。 885 | 最下一层的X代表30台极高精度的电子秤。 886 | 887 | 假设每块原料的重量都十分精确地平均落在下方的两个金属块上, 888 | 最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。 889 | 电子秤的计量单位很小,所以显示的数字很大。 890 | 891 | 工作人员发现,其中读数最小的电子秤的示数为:2086458231 892 | 893 | 请你推算出:读数最大的电子秤的示数为多少? 894 | 895 | 注意:需要提交的是一个整数,不要填写任何多余的内容。 896 | """ 897 | from fnmatch import fnmatchcase as match 898 | 899 | 900 | def get_num(): 901 | data = [] 902 | length = 0 903 | with open('数据/m', encoding='utf-8') as f: 904 | for line in f: 905 | if match(line, '*X*'): 906 | length = len(line.split()) 907 | break 908 | data.append(list(map(int, line.split()))) 909 | data.append([0] * length) 910 | # print(data, length) 911 | for i in range(1, len(data)): 912 | data[i - 1].insert(0, 0) 913 | data[i - 1].append(0) 914 | # print(data[i - 1]) 915 | for j in range(len(data[i])): 916 | data[i][j] += (data[i - 1][j] / 2 + data[i - 1][j + 1] / 2) 917 | 918 | return 2086458231 / min(data[-1]) * max(data[-1]) 919 | 920 | 921 | if __name__ == '__main__': 922 | print(get_num()) # 72665192664.0 提交整数 72665192664 923 | ``` 924 | 925 | 15. 方格分割 926 | 927 | ```python 928 | """ 929 | 6x6的方格,沿着格子的边线剪开成两部分。 930 | 要求这两部分的形状完全相同。 931 | 932 | 如图:p1.png, p2.png, p3.png 就是可行的分割法。 933 | 934 | 试计算: 935 | 包括这3种分法在内,一共有多少种不同的分割方法。 936 | 注意:旋转对称的属于同一种分割法。 937 | 938 | 请提交该整数,不要填写任何多余的内容或说明文字。 939 | """ 940 | 941 | 942 | def dfs(x, y): 943 | global ans 944 | if x == 0 or x == n or y == 0 or y == n: 945 | ans += 1 946 | return 947 | 948 | for i in range(4): 949 | tx = x + directions[i][0] 950 | ty = y + directions[i][1] 951 | if arr_map[tx][ty] == 0: 952 | arr_map[tx][ty] = 1 953 | arr_map[n - tx][n - ty] = 1 954 | dfs(tx, ty) 955 | arr_map[tx][ty] = 0 956 | arr_map[n - tx][n - ty] = 0 957 | 958 | return ans / 4 959 | 960 | 961 | n = 6 962 | ans = 0 963 | arr_map = [[0] * (n + 1) for i in range(10)] 964 | directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] 965 | arr_map[3][3] = 1 966 | # print(arr_map) 967 | 968 | if __name__ == '__main__': 969 | print(dfs(n // 2, n // 2)) # 509 970 | # print(ans) 971 | 972 | """ 973 | 注释: 974 | 从中心带你(3,3)开始出发,两边对称走,最后总数要除以4 975 | """ 976 | ``` 977 | 978 | 16. 979 | 980 | 17. 981 | 982 | --------------------------------------------------------------------------------