蓝桥杯最后冲刺(三)

张开发
2026/4/11 8:21:22 15 分钟阅读

分享文章

蓝桥杯最后冲刺(三)
import datetime adatetime.date(1900,1,1) count0 while True: if 2in str(a): count1 if adatetime.date(9999,12,31) break adatetime.timedelta(days1) print(count)# 1. 初始化卡片数组 cards [2021] * 10 # 2. 从数字1开始拼 n 1 # 3. 无限循环直到拼不出数字为止 while True: # 4. 把当前数字n转成字符串方便逐位取数字 s str(n) # 5. 标记当前数字是否能拼出来默认是True能拼 can_make True # 第一阶段完整检查卡片是否足够 # 6. 遍历当前数字的每一位 for c in s: # 7. 把字符转成整数比如1→1 num int(c) # 8. 检查对应数字的卡片是否用完了 if cards[num] 0: # 9. 只要有一位卡片不够就标记为不能拼 can_make False # 10. 直接跳出检查循环不用再看后面的位 break # 第二阶段判断是否能拼 # 11. 如果不能拼直接终止整个循环 if not can_make: break # 第三阶段消耗卡片 # 12. 能拼的话遍历每一位消耗对应卡片 for c in s: num int(c) cards[num] - 1 # 第四阶段检查下一个数 # 13. 数字1准备拼下一个 n 1 # 14. 输出结果n是第一个拼不出来的数所以答案是n-1 print(n - 1)import datetime adatetime.datetime(1970,1,1) nint(input()) secn//1000 badatetime.timedelta(secondssec) print(b.strftime(%H:%M:%S))sset() for x1 in range(20): for y1 in range(21): for x2 in range(20): for y2 in range(21): if x1x2 or y1y2: continue if x1x2: s.add(fx{x1}) else: dyy2-y1 dxx2-x1 Ady B-dx Cdx*y1-dy*x1 s.add((A,B,C)) print(len(s))n2021041820210418 cnt0 for L in range(1,n1): if n%L!0: continue for W in range(1,n1): if n%(W*L)0: cnt1 print(cnt)n2021041820210418 factor[] for i in range(1,n1): if n%i0: factor.append(i) cnt0 for L in factor: for W in factor: if n%(L*W) 0: cnt1 print(cnt)import math def lcm(a, b): return a * b // math.gcd(a, b) n 2021 dp [float(inf)] * (n 1) dp[1] 0 for i in range(2, n 1): for j in range(max(1, i - 21), i): dp[i] min(dp[i], dp[j] lcm(j, i)) print(dp[2021])题意给定一个n*m的二维整数数组用来表示一个迷宫数组中只包含.或#其中.表示可以走的路#表示不可通过的墙壁。最初有一个人位于左上角(0, 0)处已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问该人从左上角移动至右下角处至少需要移动多少次。数据保证(0, 0)处和(n-1, m-1)处的数字为0且一定至少存在一条通路。输入格式第一行包含两个整数n和m。接下来n行每行包含m.或#表示完整的二维数组迷宫。输出格式输出一个整数表示从左上角移动至右下角的最少移动次数。数据范围1≤n,m≤100输入样例5 5.#....#..#.......###....#.输出样例8求最短路径 → 必用 BFS迷宫、走地图、最少步数 → BFS 又快又稳求所有路径数 / 能不能到达 / 枚举方案 → DFS一条路走到黑适合枚举BFS一圈圈扩散第一次到就是最短迷宫最少步数 → 永远优先 BFSn,mint(input()) a[] for _ in range(n): a.append(input().strip()) vis[[False]*m for _ in range(n)] ans10000 dir[(1,0),(0,1),(-1,0),(0,-1)] def dfs(x,y,step): global ans for dx,dy in dir: xxxdx yyydy if 0xxn and 0yym and not vis[xx][yy]and a[xx][yy].: if xx n-1 and yy m-1: ansmin(ans,step1) vis[xx][yy]True dfs(xx,yy,step1) vis[xx][yy]False vis[0][0]True dfs(0,0,0) print(ans)from collections import deque def short(): n, m map(int, input().strip().split()) maze [] for _ in range(n): maze.append(list(input().strip())) dirs [(-1, 0), (1, 0), (0, 1), (0, -1)] visited [[False] * m for _ in range(n)] q deque() q.append((0, 0, 0)) visited[0][0] True while q: x, y, steps q.popleft() # 到达终点 if x n - 1 and y m - 1: print(steps) return # 四个方向 for dx, dy in dirs: nx x dx ny y dy if 0 nx n and 0 ny m: if not visited[nx][ny] and maze[nx][ny] .: visited[nx][ny] True # append 必须包成元组 (nx,ny,steps1) q.append((nx, ny, steps 1)) print(-1) if __name__ __main__: short()有 n 个货物和一艘最大载重量为 m 的船每个货物有一个重量。每个货物要么装要么不装。请你求出在不超过最大载重的前提下船能装载的最大重量。输入格式第一行两个整数 n,m第二行n 个整数表示每个货物的重量输出格式一个整数表示能装载的最大重量n, m map(int, input().split()) wlist(map(int,input().split())) max_weight0 def dfs(idx,current): global max_weight if current m: return if idxn: if currentmax_weight: max_weightcurrent return dfs(idx1,currentw[idx]) dfs(idx1,current) dfs(0,0) print(max_weight)n,mmap(int,input().split()) wlist(map(int,input().split())) ans0 def dfs(i,s): global ans if sm:return if in: ansmax(ans,s) return dfs(i1,sw[i]) dfs(i1,s) dfs(0,0) print(ans)DFSdef dfs(参数): # 递归出口 if 满足结束条件: 更新答案 return # 剪枝可选提速 if 非法情况: return # 选择分支1 dfs(下一层参数) # 选择分支2 dfs(下一层参数)BFSfrom collections import deque q deque() q.append(起点) vis[起点] True while q: 出队 到达终点就返回答案 四个方向扩展 合法就入队 标记问题描述某石油勘探区域被划分成若干个正方形的地块勘探队通过探测得知每个地块是否含有石油。含有石油的地块记为不含石油的地块记为*。如果两个含有石油的地块相邻上、下、左、右、左上、左下、右上、右下则它们属于同一个油藏。请你计算给定区域中有多少个油藏。输入格式输入包含多组数据。每组数据第一行包含两个整数 m,n分别表示区域的行数和列数。当 m0 时输入结束。接下来 m 行每行包含 n 个字符*或。输出格式对于每组数据输出一个整数表示油藏的数量。输入样例plaintext1 1 * 3 5 *** **** *** 0 0输出样例plaintext0 2dirs[(-1,-1),(-1,0),(-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] def dfs(x,y,grid,vis,m,n): vis[x][y]True for dx,dy in dirs: nxxdx nyydy if 0nxm and 0nyn and not vis[nx][ny] and grid[nx][ny]: dfs(nx,ny,grid,vis,m,n) # 必须加循环多组输入直到 m0 停止 while True: m,nmap(int,input().split()) if m0: break grid[] for _ in range(m): grid.append(input().strip()) vis[[False]*n for _ in range(m)] cnt0 for i in range(m): for j in range(n): if grid[i][j]and not vis[i][j]: cnt1 dfs(i,j,grid,vis,m,n) print(cnt)

更多文章