蓝桥杯官网刷题记录python

蓝桥杯官网刷题记录python

由于很多题都会在2020、2021、2022年省赛出现,有的在前面文章里做过的这里就不会再说了

一、空间

小蓝准备用 256MB 的内存空间开一个数组,数组的每个元素都是 32 位 二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问 256MB 的空间可以存储多少个 32 位二进制整数?
import os
import sys

# 请在此输入您的代码
## 32位占32bit
## 1MB = 1024KB
## 1KB = 1024byte
## 1byte = 8bits
print(256*1024*1024*8//32)
2.递增序列

对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 45 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。
例如,如下矩阵中
LANN
QIAO

LN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、AN 等
13 个 递增序列。注意当两个字母是从左下到右上排列时,从左向右看和从上向下看 是不同的顺序。
对于下面的 30 行 50 列的矩阵,请问总共有多少个递增序列?

VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX
首先,我们对于每一个点来说,另一个点只有在他的右边、下面或者斜对角线上答案才会+1,在斜对角线的时候是不能在他的左上边的,也就是你以那个点画轴,第四象限是不行的。因为他说了对于y = -x 这条斜线,往右和往下是一个方向,所以第四象限就不行了,而对于y=x这条斜线,往右和往下是不同的方向,因此1.3象限都可以,所以只有第一象限不行
那我们只需要遍历一次所有点,再遍历另一次所有点,符合要求时候答案+1就好了,503050*30 时间复杂度也不会很高的。

import os
import sys

请在此输入您的代码

data = ["VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG",\
"SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF",\
"ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA",\
"BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL",\
"YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH",\
"ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU",\
"XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR",\
"ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG",\
"MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA",\
"VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF",\
"GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC",\
"EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK",\
"PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW",\
"CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP",\
"RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS",\
"PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR",\
"JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL",\
"YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP",\
"HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN",\
"DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF",\
"LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW",\
"CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ",\
"IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI",\
"ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB",\
"HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP",\
"FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS",\
"VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ",\
"BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR",\
"RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY",\
"ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX"]

ans = 0
for i in range(30):
    for j in range(50):
        for k in range(30):
            for l in range(50):
                if data[i][j] < data[k][l] and ((i == k and l > j) or (j == l and k > i) or (abs(i-k) == abs(j-l) and not (k <= i and l <= j))):
                    ans += 1
print(ans)

3.等差素数列

2,3,5,7,11,13,… 是素数序列。 类似:7,37,67,97,127,157。
7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为 30,长度为 6。
2004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为 10 的等差素数列,其公差最小值是多少?

此题是个填空题,能算出来就行,时间复杂度不要很夸张就行了,想法就是公差从小到大的遍历。然后再遍历所有素数,我这边是觉得素数和公差不会很大,就范围都在2到1000,如果找不到再扩大就好了。看代码好理解的
import os
import sys
import math
### 反正是填空题,能算出来就行
# 请在此输入您的代码
def check(n):
  for i in range(2,int(math.sqrt(n)) + 1):
    if n % i == 0: return False 
  return True
find = False
for d in range(2,1000): # 公差
  if find : break
  for i in range(2,1000): # 素数
    if find: break
    n = i
    res = 0
    while check(n):
      res += 1
      n += d
    if res == 10:
      print(d)
      find = True

4.组队

作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少?
在这里插入图片描述

这题如果用Lingo做的话很好解哈哈,线性规划嘛,但在python这边遍历所有可能的话也能做,甚至我觉得用蒙特卡洛都可以把最优值给跑出来,但这里学一种不会超时的方法,毕竟去年填空题就两道,还是要多练练程序题的。
用动态规划来做 ,f[i][j] 表示 前i个学生,参加了前j个位置的最大得分。w[i][j]表示第i个学生在第j个位置的评分,如果第i个学生不参加任何位置的话,那么f[i][j] = f[i-1][j],如果第i个学生要参加第j个位置,那么f[i][j] = f[i-1][j-1] + w[i][j]。
PS:我又仔细的思考了一下,我这种做法是有问题的,但是刚好这题能过。因为如果第20名选了前面四个位置那这道题就没办法了。所以填空题的话可能用暴力或者蒙特卡洛会好一点。
import os
import sys

# 请在此输入您的代码
w = [[0]*30 for _ in range(30)]
f = [[0]* 30 for _ in range(30)]
# f[i][j] 表示前i个学生参加j个位置
w[1][1] = 97;
w[1][2] = 90;
w[2][1] = 92;
w[2][2] = 85;
w[2][3] = 96;
w[3][5] = 93;
w[4][4] = 80;
w[4][5] = 86;
w[5][1] = 89;
w[5][2] = 83;
w[5][3] = 97;
w[6][1] = 82;
w[6][2] = 86;
w[7][4] = 87;
w[7][5] = 90;
w[8][2] = 97;
w[8][3] = 96;
w[9][3] = 89;
w[10][1] = 95;
w[10][2] = 99;
w[11][3] = 96;
w[11][4] = 97;
w[12][4] = 93;
w[12][5] = 98;
w[13][1] = 94;
w[13][2] = 91;
w[14][2] = 83;
w[14][3] = 87;
w[15][3] = 98;
w[15][4] = 97;
w[15][5] = 98;
w[16][4] = 93;
w[16][5] = 86;
w[17][1] = 98;
w[17][2] = 83;
w[17][3] = 99;
w[17][4] = 98;
w[17][5] = 81;
w[18][1] = 93;
w[18][2] = 87;
w[18][3] = 92;
w[18][4] = 96;
w[18][5] = 98;
w[19][4] = 89;
w[19][5] = 92;
w[20][2] = 99;
w[20][3] = 96;
w[20][4] = 95;
w[20][5] = 81;
for i in range(1,21):
  for j in range(6):
      f[i][j] = f[i-1][j]
      if j >= 1:
        f[i][j] = max(f[i][j],f[i-1][j-1] + w[i][j])
print(f[20][5])

下面是暴力求法,也还行啊时间复杂度没有很高

import os
import sys

# 请在此输入您的代码
w = [[0]*30 for _ in range(30)]
f = [[0]* 30 for _ in range(30)]
w[1][1] = 97;
w[1][2] = 90;
w[2][1] = 92;
w[2][2] = 85;
w[2][3] = 96;
w[3][5] = 93;
w[4][4] = 80;
w[4][5] = 86;
w[5][1] = 89;
w[5][2] = 83;
w[5][3] = 97;
w[6][1] = 82;
w[6][2] = 86;
w[7][4] = 87;
w[7][5] = 90;
w[8][2] = 97;
w[8][3] = 96;
w[9][3] = 89;
w[10][1] = 95;
w[10][2] = 99;
w[11][3] = 96;
w[11][4] = 97;
w[12][4] = 93;
w[12][5] = 98;
w[13][1] = 94;
w[13][2] = 91;
w[14][2] = 83;
w[14][3] = 87;
w[15][3] = 98;
w[15][4] = 97;
w[15][5] = 98;
w[16][4] = 93;
w[16][5] = 86;
w[17][1] = 98;
w[17][2] = 83;
w[17][3] = 99;
w[17][4] = 98;
w[17][5] = 81;
w[18][1] = 93;
w[18][2] = 87;
w[18][3] = 92;
w[18][4] = 96;
w[18][5] = 98;
w[19][4] = 89;
w[19][5] = 92;
w[20][2] = 99;
w[20][3] = 96;
w[20][4] = 95;
w[20][5] = 81;
score = [0]*5
res = 0
for i in range(1,21):
    for j in range(1,21):
        for k in range(1,21):
            for l in range(1,21):
                for h in range(1,21):
                    if i != j and i != k and i != l and i != h and j != k and j != l and j != h and k != l and k != h and l != h :
                        for o in range(1,6): # 打第几个位置
                            score[0],score[1],score[2],score[3],score[4] = w[i][o],w[j][(o+1)%5],w[k][(o+2)%5],w[l][(o+3)%5],w[h][(o+4)%5]
                            res = max(res,sum(score))
print(res)

5.七段码

小蓝要用七段码数码管来表示一种特殊的文字。
在这里插入图片描述

在这里插入图片描述

这就要用到python的一些基础库了,

itertools.combiations(‘abcdefg’,3)可以用abcdefg这七个字母,把其中三个拿出来,所有的三个的组合(顺序不考虑)
itertools.permutations(‘abc’)可以把abc的所有顺序的组合给输出
那么我们只需要遍历所有的组合和顺序,看看能不能连起来就好了。

为什么要遍历顺序呢?因为有可能abcd a跟c连,c跟b连,这样子判断的时候因为a不连b,我们就判断他不相连,其实是相连的。所以要遍历到acbd时,就对了,然后就跳出循环就好了
import os
import sys
import itertools
# 请在此输入您的代码
W = {"a": ["b", "f"],
     "b": ["a", "g", "c"],
     "c": ["b", "d", "g"],
     "d": ["c", "e"],
     "e": ["d", "f", "g"],
     "f": ["a", "e", "g"],
     "g": ["b", "c", "e", "f"]
     }  # 字典,存放距离为1的字符,用来判别
s1 = []
count = 0
for i in range(1,8):
  a = list(itertools.combinations('abcdefg',i))
  for j in a:
    s1.append(''.join(j))  # 元组转化为字符串存入列表中
for i in s1:
  a = itertools.permutations(i)
  for j in a:
    for k in range(len(j) - 1):
      if j[k+1] not in W[j[k]]:break
    else:
      count += 1
      break
print(count)

6.既约分数

在这里插入图片描述

遍历咯,没啥好说的,但这直接在蓝桥杯的官网里运行会超时,如果比赛的时候用自己的填空题就不会管会不会超时了
import os
import sys

# 请在此输入您的代码
# def gcd(a,b):
#   if b == 0: return a
#   else: return gcd(b,a%b)
# res = 0
# for i in range(1,2021): # 分母
#   for j in range(1,2021):
#     if gcd(i,j) == 1: res += 1
# print(res)

print(2481215)

7.跳跃

在这里插入图片描述
在这里插入图片描述

这题不动脑子都知道用dp做,就是到这一步的最大值等于到上一步的最大值加上这一步的权值

import os
import sys

# 请在此输入您的代码
n,m = map(int,input().split())
map1 = []
for i in range(n):
  a = [int(x) for x in input().split()]
  map1.append(a)
dp = [[-200]*(m+3) for _ in range(n+3)] # 多出来三个为了防止最开始的时候会溢出
for i in range (3,n+3):
  for j in range(3,m+3):
    if i == 3 and j == 3 :
      dp[i][j] = map1[i-3][j-3]
    else:
      dp[i][j] = map1[i-3][j-3] + max(dp[i][j-1],dp[i][j-2],dp[i][j-3],dp[i-1][j],dp[i-1][j-1],dp[i-1][j-2],dp[i-2][j],dp[i-2][j-1],dp[i-3][j])
print(dp[n+2][m+2])

8.数列求值

在这里插入图片描述

题目要求最后4位数字,前面的数字是怎么变化的我们就不用考虑了,不会影响到后面四位数字的。直接一项一项求救好了,我i是20190318 比 20190324少了6位是因为前三个1不要了,然后我们a,b,c是4,5,6位,第一次循环的时候求的是第七位
a,b,c = 3,5,9 
res = 0
for _ in range(20190318):
  res = (a + b + c) % 10000
  a,b,c = b,c,res
print(res)

持续更新中…

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值