蓝桥杯题解|2019|Python版

2019 第十届蓝桥杯C/C++ 省赛B组题解

1. 试题 A: 组队

可以考虑使用 Excel 进行辅助计算。


答案:490

2. 试题 B: 年号字串

特殊的进制转换——十进制转二十六进制

27%26=1……1(即 AA)
28%26=1……2(即 AB)
329%26=12……17(即 LQ)
2019%26=77……17,又 77%26= 2……25(即 BYQ)

答案:BYQ

3. 试题 C: 数列求值

# 不能采用递归的方法,会爆栈
n = int(input())
d = 0

a=b=c=1
if n == 1 or n == 2 or n == 3:
    d = 1
else:
    for i in range(4, n+1):
        d = (a+b+c)%10000
        a, b, c = b%10000, c%10000, d%10000 


print(d)
# output: 4659

4. 试题 D: 数的分解

n=2019

def fun(t):
    # 判断是否包含 2 和 4。
    if '2' in str(t) or '4' in str(t):
        return True
    else:
        return False

result = []

for i in range(1, n+1):
    if fun(i):
        # 如果包含数字,则退出本层循环。
        continue
    for j in range(1, n+1):
        if fun(j):
            continue
        k = n - i - j
        if fun(k) or k<=0:
            # 注意 k 可能为负数。 
            continue
        if i == j or j == k or i == k:
            continue
        result.append(
                       tuple( 
                                sorted([i, j, k])
                            )
                    )
        # 保存所有满足情况的条件。
        # 注意 Python 中的 list 无法使用 set 去重。


print(len(set(result)))
# 使用 set 函数去重复,使用 len 求得方法的个数。

# output: 40785

5. 试题 E: 迷宫

from pprint import pprint
from queue import Queue
# queue 是 Python 自带的库。

string = '''010000
000100
001001
110000'''

string_list = string.split('\n')
cols = len(string_list[0])
rows = len(string_list)
# 求迷宫的行数和列数

for i in range(len(string_list)):
    string_list[i] = '1' + string_list[i] + '1'
string_list = [(cols+2)*'1'] + string_list + [(cols+2)*'1']
visited = [list(map(int, list(i))) for i in string_list]
# 为迷宫加上边界。

x_dire = [0, 1, 0, -1]
y_dire = [1, 0, -1, 0]
# 初始化方向数组

prev = [[(-1, -1)]*(cols+2) for i in range(rows+2)]
# 用于保存前一个节点

visited[1][1] = 1
que = Queue()
que.put((1,1))
# 以(0,0)为起点开始移动


while que.qsize() != 0:
    node = que.get()
    for i in range(4):
        x = node[0] + x_dire[i]
        y = node[1] + y_dire[i]
        if visited[x][y] != 1:
            visited[x][y] = 1
            prev[x][y] = (node[0], node[1])
            que.put((x, y))
# 找出前一个点的位置

route = []
def printf(node):
    if node == (-1,-1):
        return
    route.append(node)
    printf(prev[node[0]][node[1]])
printf((rows, cols))
# 找出完整的路线

dire = {
     0:'R', 1:'D', 2:'L', 3:'U'}
result = ''
while len(route) != 1:
    a = route.pop()
    b = route[-1]
    for i in range(4):
        x = a[0] + x_dire[i]
        y = a[1] + y_dire[i]
        if (x, y) == b:
            result += dire[i]

print(result)
# output: DRRURRDDDR

6. 试题 F: 特别数的和

n = int(input())

temp = []
for i in range(n+1):
    string = str(i)
    if '2' in string or '0' in string or '1' in string or '9' in string:
        temp.append(i)
result = sum(temp)

print(result)
# input: 40

7. 试题 G: 完全二叉树的权值

import math

n = int(input())
nums = list(map(int, input().split()))

h = int(math.log(n+1, 2))
# 求解二叉树的高度。

ss = []
for i in range(h):
    s = 0
    for j in range(2**i, 2**(i+1)):
        k = j-1
        s += nums[k]
    ss.append(s)
# 对每个深度的权值进行相加。

max_s = max(ss)
max_h = -1
for i in range(len(ss)):
    if max_s == ss[i]:
        max_h = i + 1
print(max_h)
# 找到权值最高的深度

# input:7
# 1 6 5 4 3 2 1
# output:2

8. 试题 H: 等差数列

n = int(input())
nums = list(map(int, input().split()))

nums.sort()
k = 100000
# 对列表进行排序

plist = [nums[i] - nums[i-1] for i in range(1, n)]
# 求解列表的差值

def fun(a, b):
    while b != 0:
        a, b = b, a%b
    return a
# 求解最小公倍数函数

minq = 1000000
for i in range(1, len(plist)):
    q = fun(plist[i-1], plist[i])
    if q < minq:
        minq = q
# 找到所有差值中的最小公倍数

res = 1
minn = min(nums)
maxn = max(nums)
while minn != maxn:
    minn += minq
    res += 1
# 求解数列中数字的个数

if 0 in plist:
    res = n
# 当公差为 0 时,数列中数字的个数为当前数字的个数。

print(res)

# input: 5
# 2 6 4 10 20
# output: 20

9. 试题 I: 后缀表达式

n, m = list(map(int, input().split()))
nums = list(map(int, input().split()))
abs_nums = list(map(abs, nums))

result = 0
s = sum(abs_nums)

if m == 0:
    result = s
else:
    if min(nums) > 0:
        result = s - min(abs_nums) * 2
    else:
        result = s 

print(result)
# input: 5 5
# 1 -2 -3 -4 5 -6 -7 -8 -9 -10 -11
# output: 66

参考教程:https://blog.csdn.net/weixin_43302818/article/details/88805530

10. 试题 J: 灵能传输

不会(

你可能感兴趣的:(编程,算法,python)