第十四届蓝桥杯模拟赛第三期填空题(python)

第一题 

问题描述
  请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。
  请将这个数的十进制形式作为答案提交。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

 将数字转成十六进制,在鉴别是否都为字幕组成。

for i in range(2022,4000):
    s = str(hex(i))[2:]
    flag = 0
    for j in s:
        if j not in ["a","b","c","d","e","f"]:
            flag = 1
    if flag == 0:
        print(i)
        break

答案:2730

第二题 

问题描述
  在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母,依次为 A 到 Z,接下来 26*26 列使用两个字母的组合,依次为 AA 到 ZZ。
  请问第 2022 列的名称是什么?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个由大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

二十六进制计数,除数取余就好 。

答案:BYT

第三题  

问题描述
  对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
  例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
  请提交满足条件的日期的总数量。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

datetime库 

import datetime

def check(time):
    year, month, day = time.split('-')
    num1, num2, num3 = 0, 0, 0
    for i in year:
        num1 += int(i)
    for i in month:
        num2 += int(i)
    for i in day:
        num3 += int(i)
    if num1 == num2 + num3:
        return True
    else: return False

ans = 0
start = datetime.date(1900, 1, 1)
end = datetime.date(9999, 12, 31)
while start <= end:
    if check(str(start)): ans += 1
    # 9999.12.31 为最大日期,在加日期则超限
    if start == end:break
    start += datetime.timedelta(days=1)
print(ans)

第四题 

问题描述
  小蓝有 30 个数,分别为:99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77 。
  小蓝可以在这些数中取出两个序号不同的数,共有 30*29/2=435 种取法。
  请问这 435 种取法中,有多少种取法取出的两个数的乘积大于等于 2022 。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

ans = 0
lst = [99, 22, 51, 63, 72, 61, 20, 88, 40, 21,
 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77]
for i in range(30):
    for j in range(30):
        if i == j:break
        res = lst[i]*lst[j]
        if res >= 2022:
            ans += 1
print(ans)

 答案:189

第五题 

问题描述
  小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 。
  110010000011111110101001001001101010111011011011101001111110
  010000000001010001101100000010010110001111100010101100011110
  001011101000100011111111111010000010010101010111001000010100
  101100001101011101101011011001000110111111010000000110110000
  010101100100010000111000100111100110001110111101010011001011
  010011011010011110111101111001001001010111110001101000100011
  101001011000110100001101011000000110110110100100110111101011
  101111000000101000111001100010110000100110001001000101011001
  001110111010001011110000001111100001010101001110011010101110
  001010101000110001011111001010111111100110000011011111101010
  011111100011001110100101001011110011000101011000100111001011
  011010001101011110011011111010111110010100101000110111010110
  001110000111100100101110001011101010001100010111110111011011
  111100001000001100010110101100111001001111100100110000001101
  001110010000000111011110000011000010101000111000000110101101
  100100011101011111001101001010011111110010111101000010000111
  110010100110101100001101111101010011000110101100000110001010
  110101101100001110000100010001001010100010110100100001000011
  100100000100001101010101001101000101101000000101111110001010
  101101011010101000111110110000110100000010011111111100110010
  101111000100000100011000010001011111001010010001010110001010
  001010001110101010000100010011101001010101101101010111100101
  001111110000101100010111111100000100101010000001011101100001
  101011110010000010010110000100001010011111100011011000110010
  011110010100011101100101111101000001011100001011010001110011
  000101000101000010010010110111000010101111001101100110011100
  100011100110011111000110011001111100001110110111001001000111
  111011000110001000110111011001011110010010010110101000011111
  011110011110110110011011001011010000100100101010110000010011
  010011110011100101010101111010001001001111101111101110011101
  如果从一个标为 1 的位置可以通过上下左右走到另一个标为 1 的位置,则称两个位置连通。与某一个标为 1 的位置连通的所有位置(包括自己)组成一个连通分块。
  请问矩阵中最大的连通分块有多大?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得。

 BFS,统计出遍历过的点数,比出最大的连通分块。

def BFS(a, i, j, flag):
    if i < 1 or i > 30 or j < 1 or j > 60:
        return False
    if a[i][j] == 0 or flag[i][j] == 1 :
        return False
    flag[i][j] = 1
    BFS(a, i - 1, j, flag)
    BFS(a, i + 1, j, flag)
    BFS(a, i, j - 1, flag)
    BFS(a, i, j + 1, flag)

def Calculate(a):
    flag = [[0] * N for _ in range(M)]
    max_num = 0
    for i in range(1,31):
        for j in range(1,61):
            if a[i][j] == 1 and flag[i][j] == 0:
                BFS(a, i, j, flag)
                num = sum([sum(row) for row in flag])
                max_num = max(max_num, num)
                flag = [[0] * N for _ in range(M)]
    return max_num

M, N = 40, 70
a = [[0] * N for _ in range(M)]
for i in range(1, 31):
    a[i][1:61:] = map(int, list(input()))
print(Calculate(a))

答案:148 

你可能感兴趣的:(蓝桥杯,职场和发展,python,算法)