Just Do IT !

Python算法学习: 2020年蓝桥杯省赛模拟赛-Python题解

字数统计: 2.8k阅读时长: 11 min
2020/04/21 Share

目录

填空题1

问题描述
  一个包含有2019个结点的无向连通图,最少包含多少条边?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案 :2018

填空题2

问题描述
  将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO、AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义。
  请问,总共能排列如多少个不同的单词。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案 :2520

填空题3

问题描述
  在计算机存储中,12.5MB是多少字节?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案 :13107200

填空题4

问题描述
  由1对括号,可以组成一种合法括号序列:()。
  由2对括号,可以组成两种合法括号序列:()()、(())。
  由4对括号组成的合法括号序列一共有多少种?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案 :14

编程题1 凯撒密码加密

问题描述
  给定一个单词,请使用凯撒密码将这个单词加密。
  凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,…,w变为z,x变为a,y变为b,z变为c。
  例如,lanqiao会变成odqtldr。
输入格式
  输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
  输出一行,表示加密后的密文。
样例输入
lanqiao
样例输出
odqtldr
评测用例规模与约定
  对于所有评测用例,单词中的字母个数不超过100

1
2
3
4
5
6
7
8
9
10
ans = ""
strq = list(input())
for i in range(len(strq)):
if 97 <= ord(strq[i]) <= 119:
strq[i] = chr(ord(strq[i]) + 3)
else:
strq[i] = chr(ord(strq[i]) - 120 + 97)
for i in range(len(strq)):
ans += strq[i]
print(ans)

编程题2 反倍数

问题描述
  给定三个整数 a, b, c,如果一个整数既不是 a 的整数倍也不是 b 的整数倍还不是 c 的整数倍,则这个数称为反倍数。
  请问在 1 至 n 中有多少个反倍数。
输入格式
  输入的第一行包含一个整数 n。
  第二行包含三个整数 a, b, c,相邻两个数之间用一个空格分隔。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
30
2 3 6
样例输出
10
样例说明
  以下这些数满足要求:1, 5, 7, 11, 13, 17, 19, 23, 25, 29。
评测用例规模与约定
  对于 40% 的评测用例,1 <= n <= 10000。
  对于 80% 的评测用例,1 <= n <= 100000。
  对于所有评测用例,1 <= n <= 1000000,1 <= a <= n,1 <= b <= n,1 <= c <= n。

1
2
3
4
5
6
7
8
9
n = int(input())
ans = 0
a,b,c = map(int, input().split())
for i in range(1, n+1):
if i % a != 0 and i % b != 0 and i % c != 0:
ans += 1
else:
continue
print(ans)

编程题3 摆动序列

问题描述
  如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。即 a[2i]<a[2i-1], a[2i+1]>a[2i]。
  小明想知道,长度为 m,每个数都是 1 到 n 之间的正整数的摆动序列一共有多少个。
输入格式
  输入一行包含两个整数 m,n。
输出格式
  输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
样例输入
3 4
样例输出
14
样例说明
  以下是符合要求的摆动序列:
  2 1 2
  2 1 3
  2 1 4
  3 1 2
  3 1 3
  3 1 4
  3 2 3
  3 2 4
  4 1 2
  4 1 3
  4 1 4
  4 2 3
  4 2 4
  4 3 4
评测用例规模与约定
  对于 20% 的评测用例,1 <= n, m <= 5;
  对于 50% 的评测用例,1 <= n, m <= 10;
  对于 80% 的评测用例,1 <= n, m <= 100;
  对于所有评测用例,1 <= n, m <= 1000。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ans = 0
m, n = map(int, input().split())
dp = [[0 for _ in range(1024)] for _ in range(1024)]

for i in range(1, n + 1):
dp[1][i] = n - i + 1

for i in range(2, m+1):
if i & 1:
for j in range(n , 0, -1):
dp[i][j] = (dp[i - 1][j - 1] + dp[i][j + 1]) % 10000

else:
for j in range(1, n+1):
dp[i][j] = (dp[i - 1][j + 1] + dp[i][j - 1]) % 10000

if m & 1:
ans = dp[m][1]
else:
ans = dp[m][n]
print(ans)

编程题4 螺旋矩阵

问题描述
  对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
  例如,一个 4 行 5 列的螺旋矩阵如下:
  1 2 3 4 5
  14 15 16 17 6
  13 20 19 18 7
  12 11 10 9 8
输入格式
  输入的第一行包含两个整数 n, m,分别表示螺旋矩阵的行数和列数。
  第二行包含两个整数 r, c,表示要求的行号和列号。
输出格式
  输出一个整数,表示螺旋矩阵中第 r 行第 c 列的元素的值。
样例输入
4 5
2 2
样例输出
15
评测用例规模与约定
  对于 30% 的评测用例,2 <= n, m <= 20。
  对于 70% 的评测用例,2 <= n, m <= 100。
  对于所有评测用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
n, m = map(int, input().split())
r, c = map(int, input().split())
ansList = [[0 for _ in range(m)] for _ in range(n)]
vis = [[0 for _ in range(m)] for _ in range(n)]
i = 1
x = 0 # 当前纵坐标
y = 0 # 当前横坐标
while i < n * m:

while y < m and vis[x][y] == 0:
ansList[x][y] = i
vis[x][y] = 1
i += 1
y += 1

y -= 1
x += 1

while x < n and vis[x][y] == 0:
ansList[x][y] = i
vis[x][y] = 1
i += 1
x += 1

x -= 1
y -= 1

while y >= 0 and vis[x][y] == 0:
ansList[x][y] = i
vis[x][y] = 1
i += 1
y -= 1

y += 1
x -= 1

while x >= 0 and vis[x][y] == 0:
ansList[x][y] = i
vis[x][y] = 1
i += 1
x -= 1
x += 1
y += 1
print(ansList[r-1][c-1])

编程题5 村庄通电

问题描述
  2015年,全中国实现了户户通电。作为一名电力建设者,小明正在帮助一带一路上的国家通电。
  这一次,小明要帮助 n 个村庄通电,其中 1 号村庄正好可以建立一个发电站,所发的电足够所有村庄使用。
  现在,这 n 个村庄之间都没有电线相连,小明主要要做的是架设电线连接这些村庄,使得所有村庄都直接或间接的与发电站相通。
  小明测量了所有村庄的位置(坐标)和高度,如果要连接两个村庄,小明需要花费两个村庄之间的坐标距离加上高度差的平方,形式化描述为坐标为 (x_1, y_1) 高度为 h_1 的村庄与坐标为 (x_2, y_2) 高度为 h_2 的村庄之间连接的费用为
  sqrt((x_1-x_2)(x_1-x_2)+(y_1-y_2)(y_1-y_2))+(h_1-h_2)*(h_1-h_2)。
  在上式中 sqrt 表示取括号内的平方根。请注意括号的位置,高度的计算方式与横纵坐标的计算方式不同。
  由于经费有限,请帮助小明计算他至少要花费多少费用才能使这 n 个村庄都通电。
输入格式
  输入的第一行包含一个整数 n ,表示村庄的数量。
  接下来 n 行,每个三个整数 x, y, h,分别表示一个村庄的横、纵坐标和高度,其中第一个村庄可以建立发电站。
输出格式
  输出一行,包含一个实数,四舍五入保留 2 位小数,表示答案。
样例输入
4
1 1 3
9 9 7
8 8 6
4 5 4
样例输出
17.41
评测用例规模与约定
  对于 30% 的评测用例,1 <= n <= 10;
  对于 60% 的评测用例,1 <= n <= 100;
  对于所有评测用例,1 <= n <= 1000,0 <= x, y, h <= 10000。

1
2


编程题6 小明植树

问题描述
  小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗。
  小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n 个。他们准备把自己带的树苗都植下去。
  然而,他们遇到了一个困难:有的树苗比较大,而有的位置挨太近,导致两棵树植下去后会撞在一起。
  他们将树看成一个圆,圆心在他们找的位置上。如果两棵树对应的圆相交,这两棵树就不适合同时植下(相切不受影响),称为两棵树冲突。
  小明和朋友们决定先合计合计,只将其中的一部分树植下去,保证没有互相冲突的树。他们同时希望这些树所能覆盖的面积和(圆面积和)最大。
输入格式
  输入的第一行包含一个整数 n ,表示人数,即准备植树的位置数。
  接下来 n 行,每行三个整数 x, y, r,表示一棵树在空地上的横、纵坐标和半径。
输出格式
  输出一行包含一个整数,表示在不冲突下可以植树的面积和。由于每棵树的面积都是圆周率的整数倍,请输出答案除以圆周率后的值(应当是一个整数)。
样例输入
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
样例输出
12
评测用例规模与约定
  对于 30% 的评测用例,1 <= n <= 10;
  对于 60% 的评测用例,1 <= n <= 20;
  对于所有评测用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def isTure(i):
for j in range(n):
if i != j and vis[j]:
if (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) < (r[i] + r[j]) * (r[i] + r[j]):
return False
return True


def dfs(step, sum):
global ans
if step == n:
ans = max(ans, sum)
return
for i in range(n):
if vis[i] == 0:
tmp = r[i]
if isTure(i) == False:
r[i] = 0
vis[i] = 1
dfs(step + 1, sum + r[i] * r[i])
vis[i] = 0
r[i] = tmp

if __name__ == '__main__':
PI = 3.14
ans = 0
x = []
y = []
r = []
n = int(input())
vis = [0 for _ in range(n)]
for _ in range(n):
xt, yt, rt = map(int, input().split())
x.append(xt)
y.append(yt)
r.append(rt)
dfs(0, 0)

print(ans)
CATALOG
  1. 1. 目录
    1. 1.1. 填空题1
    2. 1.2. 填空题2
    3. 1.3. 填空题3
    4. 1.4. 填空题4
    5. 1.5. 编程题1 凯撒密码加密
    6. 1.6. 编程题2 反倍数
    7. 1.7. 编程题3 摆动序列
    8. 1.8. 编程题4 螺旋矩阵
    9. 1.9. 编程题5 村庄通电
    10. 1.10. 编程题6 小明植树