2019 第十届蓝桥杯C/C++ 省赛B组题解
可以考虑使用 Excel 进行辅助计算。
答案:490
特殊的进制转换——十进制转二十六进制
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
# 不能采用递归的方法,会爆栈
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
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
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
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
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
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
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
不会(