十四届蓝桥杯模拟赛

十四届蓝桥杯模拟赛

Ikko Lv3

1

请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。
  请将这个数的十进制形式作为答案提交。
AAA转化为十进制即可

2

在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母,依次为 A 到 Z,接下来 26*26 列使用两个字母的组合,依次为 AA 到 ZZ。
  请问第 2022 列的名称是什么?

1
2
3
4
5
6
7
8
9
10
a=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
count = 0
q=2022-26*26-26
for i in range(26):
for k in range(26):
for l in range(26):
count+=1
if count==q:
print(a[i],a[k],a[l])

b y t

3

对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
  例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
  请提交满足条件的日期的总数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import datetime as dt
begin =dt.date(1900,1,1)
end = dt.date(9999,12,31)
count = 0
def countx(n):
#将数字作为字符串输入
listx = []
listx = list(n) #将字符串转换为列表
s = 0
for i in range(len(listx)):
s+= int(listx[i]) #将字符转换为整数型,并累加列表中的每个数字
return s
for i in range((end - begin).days+1):
day = begin + dt.timedelta(days=i)
nian = str(day.year)
w = str(day.month)
da = str(day.day)
count1 = countx(nian)
count2 = countx(da)+countx(w)


if count1 == count2:
count+=1
print(count)

70910

4

小蓝有 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 。

1
2
3
4
5
6
7
a = [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]
count=0
for i in range(29):
for j in range(i+1,30):
if (a[i]*a[j])>=2022:
count+=1
print(count)

189

5

小蓝有一个 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 的位置连通的所有位置(包括自己)组成一个连通分块。 请问矩阵中最大的连通分块有多大?

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
def dfs(m,n,flag):

if n<0 or m<0 or m>29 or n>59:
return False
if flag[m][n]==1 or a[m][n]==0:
return False

flag[m][n] = 1
dfs(m-1,n,flag)
dfs(m,n-1,flag)
dfs(m+1,n,flag)
dfs(m,n+1,flag)
return False

m = '''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'''
a1= m.split('\n')
a = [[int(x) for x in row] for row in a1]
print(a)
max1 = 0

for i in range(30):
for j in range(60):
if a[i][j]==1:
flag = [[0] * 60 for _ in range(30)]
dfs(i,j,flag)
#max1 = max(max1,flag.count(1))
max1 = max(max1,sum([sum(row) for row in flag]))

print(max1)

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def dfs(m,n,flag):
if flag[m][n]==1 or a[m][n]==0:
return False
flag[m][n]=1
if m>0 :#向上


dfs(m-1,n,flag)
if n>0 :#想左


dfs(m,n-1,flag)
if m<29 :#想下


dfs(m+1,n,flag)
if n<59 :#想→


dfs(m,n+1,flag)

return False

148

题目描述

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。

输入描述

输入一行包含一个单词,单词只由小写英文字母组成。

对于所有的评测用例,输入的单词长度不超过 1000。

输出描述

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。

第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
import os
import sys
zimu = input()
max1 = 0
max2 = ‘a’

请在此输入您的代码

1
2
3
4
5
6
7
a = [0*26]
for i in range(26):
if max1<zimu.count(chr( i+ord('a') )):
max1 = zimu.count(chr( i+ord('a') ))
max2 = chr( i+ord('a') )
print(max2)
print(max1)

本题不难,需要注意的点在于 ord() 返回字符对应的ASCII码 cha() 返回ASCII码对应的字符,这点与c语言不同

简单题

蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。

输入描述
输入的第一行包含一个整数
n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出描述
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os
import sys
n = int(input())
well,ok=0,0
# 请在此输入您的代码
for i in range(n):
a=int(input())
if a>=85:
well+=1
ok+=1
elif a>=60:
ok+=1
print("{:.0f}%".format(100*ok/n))
print("{:.0f}%".format(100*well/n))

此题需要注意蓝桥杯常考的print格式化输出,考前需要复习 format语法

小蓝在玩一个寻宝游戏,

游戏在一条笔直的道路上进行, 道路被分成了 n 个方格, 依次编号 1 至 n, 每个方格上都有一个宝物, 宝物的分值是一个整数 (包括正数、负数和零), 当进入一个方格时即获得方格中宝物的分值。小蓝可 以获得的总分值是他从方格中获得的分值之和。

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
import math

def is_prime(x):
if x < 2:
return False
for i in range(2, int(math.sqrt(x))+1):
if x % i == 0:
return False
return True

def find(x):
if x == 1:
return 1
for i in range(2, int(math.sqrt(x))+1):
if x % i == 0 and is_prime(i):
return i
return x

n = int(input())
a = list(map(int, input().split()))
f = [float('-inf')] * (n+1)
f[1] = a[0]

for i in range(1, n+1):
x = i + find(n-i)
for j in range(i+1, x+1):
f[j] = max(f[j], f[i]+a[j-1])

print(f[n])

此题最后一个测试用例超时了,蓝桥杯官方也不给具体测试用例,相似的代码c++能通过。
需要注意的是求质数,0,1,2都不是质数,求质因数可能是这个数本身

某国赛真题

原题
解法,此题需要约数个数定理
定理
pi应为素数
示例代码:

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
45
46
47
48
49
50
51
52
53
54
55
56
 

"""
要进行质因数分解
随后用到求约数个数的公式:
(每个质数的次幂+1)相乘
"""


# 阶乘约数


"""
100的阶乘,可表示为1x2x3...x100
因此可以对参与阶乘的2,3,4,5,6到100进行质因数分解
既然质因数分解的数最高也就100
那么定义n = 100,也就是要质因数分解的最大的数,就能收集到所需的质数了。
"""

n = 100
p = [2] # 质数集,其中2


for i in range(3, n + 1):
j = 2
while j < i:
if i % j == 0: # 如果有比 i 小的数可以将i整除,就表示i为合数,break结束循环,就不会把i加入质数集中.
break
j += 1
else:
p.append(i)


m = {}
for i in p:
m[i] = 1 # 每个质数初始为1,对应公式:”(某一质数的次数 + 1) * (某二质数的次数 + 1)“ 中的1。


for i in range(2, n + 1):
# 遍历 [2, 100] 对应100的阶乘为1x2x3...x100。
for j in p: # 遍历质数,将每个参与100阶乘中相乘的数都质因数分解一下。# (比如 6 分解成 2*3 ,12 分解成 2*2*3)
if j > i: # 当所遍历到的质数比要进行质因数分解的数要大时,就直接结束这一层for j in p循环。
break
while i % j == 0: # 这里是看 i 可以被 "当前 j" 整除多少次,
# 当 i 不能再被 "当前 j" 整除时,while循环结束,
# for j in p循环继续尝试下一个j,直到j > i,满足if条件,break
i //= j

m[j] += 1 # 让对应的质数个数 + 1

s = 1 # 定义一个变量s,用于接收相乘得出的约数个数。(因为是相乘,所以s要等于1)


for i in m.values(): # 所有质因子的个数相乘,就是约数个数了。
s *= i
print(s)
  • Title: 十四届蓝桥杯模拟赛
  • Author: Ikko
  • Created at : 2023-03-02 22:56:56
  • Updated at : 2023-04-10 00:09:13
  • Link: https://redefine.ohevan.com/2023/03/02/十四届蓝桥杯模拟赛/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments