├── .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 |
4 |
5 |
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 |
5 |
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 |
--------------------------------------------------------------------------------