备战2024年蓝桥杯 省赛第一期模拟赛题单
备战Python大学A组
第一题:字母数
第二题:大乘积
第三题:星期几
第四题:清理水域
第五题:列名
第六题:最大联通
第七题:信号覆盖
第八题:附近最小
第九题:第三小
第十题:特殊日期
第十一题:3个1
第十二题:删字母
第十三题:最小数位和
第十四题:放苹果
第十五题:对折次数
第十六题:统计次数
第十七题:电扇控制
第十八题:最大查
第十九题:最尖位置
第二十题:最近分解
第一题:字母数
解题思路:语法
【Python程序代码】
def pd(s):
for i in s:
if i<'a' or i>'z':return False
return True
for i in range(2023,9999999):
if pd(hex(i)[2:]):
print(i)
break
最终结果:2730
第二题:大乘积
解题思路:语法
【Python程序代码】
res = 0
num = [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(i+1,30):
if num[i]*num[j]>2022:
res += 1
print(res)
最终结果:189
第三题:星期几
解题思路:语法
【Python程序代码】
w = int(input())
n = int(input())
if (w+n)%7==0:
print(7)
else:
print((w+n)%7)
第四题:清理水域
解题思路:语法
【Python程序代码】
n,m = map(int,input().split())
k = int(input())
a = [[0]*(m+5) for _ in range(n+5)]
for i in range(k):
x1,y1,x2,y2 = map(int,input().split())
a[x1][y1]+=1
a[x1][y2+1]-=1
a[x2+1][y1]-=1
a[x2+1][y2+1]+=1
res = 0
for i in range(1,n+1):
for j in range(1,m+1):
a[i][j]+= a[i-1][j]+a[i][j-1]-a[i-1][j-1]
if a[i][j]==0:res+=1
print(res)
第五题:列名
解题思路:语法(代码有小bug不过无关紧要)
【Python程序代码】
res = ""
t = 2022
while t:
tep = t%26
if tep==0:
res = 'Z' + res
else:
res = chr( ord('A')+tep-1 )+res
t//=26
print(res)
最终结果:BYT
第六题:最大联通
【问题描述】
小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 。如果从一个标为 1 的位置可以通过上下左右走到另一个标为 1 的位置,则称两个位置连通。与某一个标为 1 的位置连通的所有位置(包括自己)组成一个连通分块。请问矩阵中最大的连通分块有多大?
解题思路:BFS连通性判断
【Python程序代码】
from collections import *
mp = [[0]*65]
for i in range(30):
tep = [0] + list(input())
mp.append(tep)
vis = [[0]*(65) for i in range(36)]
res = 0
dic = [(1,0),(0,1),(-1,0),(0,-1)]
def bfs(x,y):
q = deque()
q.append((x,y))
vis[x][y]=1
k = 0
while q:
t = q.popleft()
k += 1
for i in range(4):
nx,ny = t[0]+dic[i][0],t[1]+dic[i][1]
if nx<1 or nx>30 or ny<1 or ny>60 :continue
if vis[nx][ny] or mp[nx][ny]=='0':continue
q.append((nx,ny))
vis[nx][ny]=1
return k
for i in range(1,31):
for j in range(1,61):
if mp[i][j]=='1':
res = max(res,bfs(i,j))
print(res)
print(148)
最终结果:148
第七题:信号覆盖
解题思路:语法
【Python程序代码】
N,M,n,R = map(int,input().split())
vis = [[0]*(M+5) for _ in range(N+5)]
def dis(x1,y1,x2,y2):
return (x1-x2)**2 + (y1-y2)**2
for i in range(n):
x,y = map(int,input().split())
for i1 in range(x-R,x+R+1):
for i2 in range(y-R,y+R+1):
if i1<0 or i1>N or i2<0 or i2>M:continue
if dis(x,y,i1,i2)<=R**2:
vis[i1][i2]=1
res = 0
for i in range(N+1):
for j in range(M+1):
if vis[i][j]:res+=1
print(res)
第八题:附近最小
解析思路:直接从小开始枚举,不过这种枚举容易被卡,题目友好
【Python程序代码】
n = int(input())
a = list(map(int,input().split()))
k = int(input())
new = sorted([ (num,i) for i,num in enumerate(a) ] )
st = [0]*(n)
ans = [0]*(n)
for num,i in new:
for j in range(max(0,i-k),min(n,i+k+1)):
if st[j]==0:
st[j]=1
ans[j]=num
if sum(st)==n:break
for i in range(n):
print(ans[i],end=' ')
关于RMQ问题问题一题多解:朴素法、ST算法、单调队列、树状数组可以看蓝桥云--附近最小
第九题:第三小
解析思路:语法
【Python程序代码】
n = int(input())
a = list(map(int,input().split()))
tep = sorted(a[:3])
print(tep[2],end=' ')
for i in range(3,n):
if a[i]<=tep[0]:
tep[0],tep[1],tep[2]=a[i],tep[0],tep[1]
elif tep[0]<a[i]<=tep[1]:
tep[0],tep[1],tep[2]=tep[0],a[i],tep[1]
elif tep[1]<a[i]<=tep[2]:
tep[0],tep[1],tep[2]=tep[0],tep[1],a[i]
#print(tep)
print(tep[2],end=' ')
第十题:特殊日期
解析思路:循环遍历找符合要求的,还好是填空题。
【Python程序代码】
def pd(x):
if x%400==0 or (x%100!=0 and x%4==0):return True
return False
res = 1
yue = [0,31,28,31,30,31,30,31,31,30,31,30,31]
for year in range(2000,2000000):
if pd(year):yue[2]=29
else: yue[2]=28
for mon in range(1,13):
if year%mon!=0:continue
for day in range(1,yue[mon]+1):
if year%mon==0 and year%day==0:res += 1
print(res)
print(35813063)
最终结果:35813063
第十一题:3个1
解析与思路:取决于Python好用的api,大水题
【Python程序代码】
now = 0
for i in range(1,99999999999):
er = bin(i)[2:]
er = [int(j) for j in er]
if sum(er)==3:
now+=1
if now==23:
print(i)
break
最终结果:70
第十二题:删字母
解析思路: 优先队列思想
【Python程序代码】
n,m = map(int,input().split())
s = input()
result = []
for i in range(len(s)):
while m and result and result[-1]>s[i]:
result.pop()
m -= 1
result.append(s[i])
if m>0:print(''.join(result[:n-m]))
else:print("".join(result))
第十三题:最小数位和
解析与思路:枚举判断每一个就可以
【Python程序代码】
res,num = 999999,0
for i in range(8):
tep = list(map(int,input().split()))
for j in tep:
kk = [int(_) for _ in str(j)]
ws = sum(kk)
if ws<res:
res=ws
num=j
print(res,num)
print(223321)
最终结果:223321
第十四题:放苹果
解析与思路:Soeasy
【Python程序代码】
su = 2023
x = 3*3*4
print(su//x)
最终结果:56
第十五题:对折次数
解析与思路:见代码,不建议用除法,容易出错。
【Python程序代码】
x = int(input())
res = 0
l = 1
while l<x:
l*=2
res += 1
print(res)
第十六题:统计次数
解析与思路:练语法
【Python程序代码】
s = input()
for i in range(10):
print(s.count(str(i)),end=' ')
第十七题:电扇控制
解析与思路:语法
【Python程序代码】
ans = ['low','mid','high']
n = int(input())
print(ans[n%3])
第十八题:最大差
解析思路:语法
【Python程序代码】
from math import *
n,m=30,20
mp = [[0]*(m+5)]
for i in range(30):
tep = [0] + list(map(int,input().split()))
def work(x,y):
res = 0
for i in range(x-5,x+6):
for j in range(y-5,y+6):
if i<1 or i>n or j<1 or j>m:continue
if int(fabs(i-x))+int(fabs(j-y))<=5:
res = max(res, int(fabs(mp[x][y]-mp[i][j])))
return res
ans = 0
for i in range(1,31):
for j in range(1,21):
ans = max(ans,work(i,j))
print(ans)
print(8940)
最终结果:8940
第十九题:相近分解
解析思路:枚举
【Python程序代码】
from math import *
s = set()
for b in range(1,100):
for a in range(b-2,b+3):
for c in range(b-2,b+3):
if int(fabs(a-c))<=2 and a*b*c>0:s.add(a*b*c)
s = list(s)
s.sort()
print(s[22])
最终结果:120
第二十题:最尖位置
解析与思路: 语法
【Python程序代码】
n = int(input())
a = [0] + list(map(int,input().split()))
res = 0
for i in range(1,n+1):
if i==1 or i==n:continue
if a[i]<a[i-1] and a[i]<a[i+1]:
res = max(res,(a[i-1]-a[i])*(a[i+1]-a[i]))
print(res)