赞
踩
备战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
解析与思路:取决于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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。