蓝桥杯2020年3月模拟题思路与解答过程(python版)Part 1

蓝桥杯2020年3月模拟题思路与解答过程(python版)

填空题1-4

问题1:在计算机存储中,12.5MB是多少个字节?

Byte和bit的区别:一个bit是一个0或1,中文叫做一个二进制位。一个Byte是8个bit,中文名称叫一个字节

12.5*1024*1024 =13107200

问题2:一个包含2019个节点的有向图,最多包含多少条边?(不允许有重复的边)

2019*2018 =4074342

如果是无向图的话为2019*2018/2 = 2037171

问题3:将LANQIAO中的字母重新排列,可以得到不同的单词,注意7个单词都要用上,请问有多少个不同的单词?

7!/2 =2520

问题4:由1对括号,可以组成一种合法序列()。由2对括号,可以组成两种合法括号序列()(),(()).由四队括号组成的合法括号序列共有多少种?

找规律:
一对括号时:()   count1 = 1
两对括号时:()(),(()) count2 = 1+count1 = 1+1=2
三对括号时:()()(),(())(),()(()),(()()),((((())))) count3 = 1+2*count1+count2 = 1+2+2 = 5
四对括号时:()()()(),3*(count1)()(),2*(count2)(),(count1)(count1),(count3)
count4 = 1+3+2*count2 +1+count3=14

问题5

给定三个整数a,b,c,如果一个整数既不是a的整数倍也不是b的整数倍还不是c的整数倍,则称为反倍数,请问在1到n中有多少个反倍数。

【输入格式】:输入的第一行包括一个整数n,第二行包括三个整数a,b,c相邻两个数之间用空格分隔。

【输出格式】:输出一行包含一个整数,表示答案。

# Input:
30
2 3 6
# Output:
10
n = int(input())
a,b,c = input().split(' ')
count = 0
for i in range(1,n+1):
    if not i%int(a)==0 and not i%int(b)==0 and not i%int(c)==0:
        count += 1
print(count)

问题6

给定一个单词,请使用凯撒密码将这个单词加密。凯撒密码是一种替换加密的技术,单词中所有的字母都在字母表商向后偏移三维后被替换成密文即a被替换成d,z被替换成c。

【输入样例】:lanqiao

【输出样例】:odqtldr

【输入格式】:输入一行包含一个单词,单词中只包含小写英文字母。

【输出格式】:输出一行表示加密后的密文

str = input()
lst = []
for i in str:
    temp = ord(i)+3
    if ord('d') <= temp <= ord('z'):
        lst.append(chr(temp))
    else:
        temp = temp + ord('a')-ord('z')
        lst.append(chr(temp))
final = "".join(lst)
print(final)

问题7

对于一个n行m列的表格,我们可以使用螺旋的方式给表格填上正整数,我们填好的表格为一个螺旋矩阵。例如,一个四行五列的螺旋矩阵如下:

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

思路:按层数分隔,最外层为(行数+列数-2)* 2

首先确定层数,然后判断在上下左右哪个部分上:

all = input().split(' ') # str
row_all = int(all[0])
col_all = int(all[1])
target = input().split(' ') # str
r = int(target[0])
c = int(target[1])
cen = min(r-1,c-1,row_all-r,col_all-c)
num = 0
for i in range(cen):
    num += (row_all+col_all-2)*2
    row_all,col_all = row_all-2,col_all-2
    
if r-1 == cen:
    num += r - cen
    print(num)
elif row_all - r +cen == 0:
    num += row_all + col_all - 2 +col_all+ cen - c +1 
    print(num)
elif c - 1 == cen:
    num += 2*col_all + row_all - 2 + row_all + cen - c
    print(num)
elif col_all - c + cen == 0:
    num += col_all + r - cen -1
    print(num)

问题8

如果一个序列的奇数项都比前一项大,一个序列的偶数项都比前一项小,则称为一个一个摆动序列 即a[2i]<a[2i-1],a[2i+1]>a[2i],小明想知道长度为m,每个数都是1到n之间的正整数的摆动序列一共有多少个?

【输入格式】输入一行包括两个整数m,n

【输出格式】输出一个整数表达答案,答案可能很大,请输出答案除以10000的余数。

# 样例输入
3 4
# 样例输出
14

分析:由题意得:暴力求解(枚举法)的话:算法复杂度为O(n^m), 显然当nm增大时,显然不能为我们解决问题。因此为了降低复杂度,我们考虑在寻找的过程无需遍历所有情况,而是通过求解出正确答案。

  1. a[2i - 1]>a[2i]<a[2i+1]可得,第i项时,当i为奇数时,它应该大于前一项;当i为偶数时,它应该小于前一项,因此不妨建立动态规划,在进行迭代的过程中进行剪枝,并在此过程中,计算出前n项选择。

  2. 因此不妨初始化第一次迭代项count[1][j] = [0, n, n-1, n-2, ...,1, 0], 其中count[j]位置为第一次迭代选择大于等于j时所满足的所有情况的数量。所以对于每一项有如下特点:

    1. 对于所有奇数迭代项:count[i][j] = count[i-1][j-1]+count[i][j+1], 即第i次迭代选择大于等于j时所能选择的数量等于上一次迭代(由于此次迭代为奇数次,i-1必为偶数次)中所有小于等于选择j-1的次数之和再加上此次迭代中选择大于等于j+1的次数。
    2. 对于所有偶数迭代项:对第i次迭代中,选择大于等于count[i][j] = count[i-1][j+1]+count[i][j-1],即第i项选择小于等于j的总数等于第i项选择小于等于j-1的总数加上第i-1项选择大于等于j+1项。
    3. 因此当m为奇数时,摆动序列全部的数量为count[m][1], 即选择m次选择大于等于1的所有序列个数;当m为偶数时,摆动序列的全部数量为:count[m][n], 即第m个序列选择大于等于m的序列总数量。
m, n = map(int, input().split(' '))
# 初始化count二维列表
count = []
for i in range(m+2):
    temp = []
    for j in range(n+2):
        temp.append(0)
    count.append(temp[:])
    
for i in range(1, n+1): # 初始化第一列
    count[1][i] = n-i+1
for i in range(2, m+1):
    if i & 1:
        for j in range(n, 0, -1):
            count[i][j] = (count[i-1][j-1] + count[i][j+1]) % 10000
    else:
        for j in range(1, n+1):
            count[i][j] = (count[i-1][j+1] + count[i][j-1]) % 10000
ans = count[m][1] if m & 1 else count[m][n]
print(ans)

注:
参考博客:
https://qiguanjie.blog.csdn.net/article/details/105622530(第八题)
9-10题详解请参见 蓝桥杯2020年3月模拟题思路与解答过程(python版)Part 2

猜你喜欢

转载自blog.csdn.net/weixin_45915507/article/details/114645382