十五届蓝桥杯第一期模拟赛题单(C++、java、Python)

备战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)

猜你喜欢

转载自blog.csdn.net/w2563216521/article/details/134705914
今日推荐