GESP四级练习,函数与传参+递推,难度普及/提高。题目描述
小 A 有一张 M 行 N 列的地形图,其中第 i 行第 j 列的数字 a_{ij} 代表坐标 (i,j) 的海拔高度。停机坪为一个 3 × 3 的区域且内部所有 9 个点的最大高度和最小高度之差不超过 H。
小 A 想请你计算出,在所有适合建造停机坪的区域中,区域内部 9 个点海拔之和最大是多少。
输入格式
第一行三个正整数 M, N, H,含义如题前所示。
之后 M 行,第 i 行包含 N 个整数 a_{i1}, a_{i2}, …, a_{iN},代表坐标 (i, j) 的高度。
数据保证总存在一个适合建造停机坪的区域。
输出格式
输出一行,代表最大的海拔之和。
输入样例
5 5 32 5 5 5 53 5 1 5 14 5 5 5 55 5 2 5 26 3 5 5 2
输出样例
40
数据范围
对于所有测试点,保证 1 ≤ M, N ≤ 10^3, 1 ≤ H, a_{ij} ≤ 10^5。
知识技能点:
二维数组处理:处理M×N的地形图
滑动窗口:遍历所有3×3区域
条件判断:最大最小高度差不超过H
数值计算:区域内的海拔和计算
算法优化:在数据范围较大时需要考虑效率
解题思路分析
核心问题:
找到所有满足条件的3×3区域:
区域内9个点的最大高度差 ≤ H
在满足条件1的区域中,找到海拔和最大的
解题步骤:
读取输入数据
遍历所有可能的3×3区域(左上角坐标范围:0到M-3行,0到N-3列)
对每个3×3区域:
提取9个点的高度
计算最大值和最小值
检查是否满足条件:max-min ≤ H
如果满足,计算9个点的和
记录满足条件的区域中的最大和
# 读取输入:M行,N列,最大高度差HM, N, H = map(int, input().split())# 读取地形图数据a = [list(map(int, input().split())) for _ in range(M)]# 初始化最大海拔和ans = 0# 遍历所有可能的3×3区域的左上角坐标for i in range(M - 2): # 行范围:0 到 M-3 for j in range(N - 2): # 列范围:0 到 N-3 # 提取3×3区域的9个点的高度 # 方法1:使用列表拼接(原代码方式) b = a[i][j:j + 3] + a[i + 1][j:j + 3] + a[i + 2][j:j + 3] # 方法2:使用嵌套循环(更清晰) # region = [] # for x in range(3): # for y in range(3): # region.append(a[i+x][j+y]) # 检查条件:最大高度差不超过H if max(b) - min(b) <= H: # 计算9个点的海拔和 current_sum = sum(b) # 更新最大海拔和 if current_sum > ans: ans = current_sum# 输出结果print(ans)
题目描述
小A有M元预算。商店有N个商品,每个商品有商品名S、价格P和优先级V三种属性,其中V为正整数,且V越小代表商品的优先级越高。
小A的购物策略为:
小A想知道能购买哪些商品。
输入格式
第一行两个正整数M, N,代表预算和商品数。
之后N行,每行一个商品,依次为S_i, P_i, V_i,代表第i个商品的商品名、价格、优先级。
数据保证不存在两个名字相同的商品。
输出格式
按照字典序从小到大的顺序,输出所有购买商品的商品名。
输入样例
20 4apple 6 8bus 15 1cab 1 10water 4 8
输出样例
buscabwater
数据范围
对于所有测试点,保证 1 ≤ |S_i| ≤ 10, 1 ≤ M, P_i ≤ 10^5, 1 ≤ N ≤ 10^3, 1 ≤ V_i ≤ 10。商品名仅由小写字母组成且不存在两个相同的商品名。
考核内容分析
多关键字排序:按照优先级、价格、名字字典序排序
模拟购物过程:按照排序顺序依次购买直到预算不足
字符串处理:读取商品名并按字典序输出
数据结构:列表存储商品信息,元组作为排序键
解题思路分析
1.读取预算M和商品数N
2.读取每个商品的信息,将(优先级, 价格, 商品名)作为元组存入列表
3.按照(优先级升序, 价格升序, 名字字典序)排序
4.遍历排序后的列表,如果预算足够购买当前商品,则购买并记录商品名
5.将购买的商品名按字典序排序后输出
# 存储所有商品的列表lst = []# 读取N个商品的信息for i in range(n): s, p, v = input().split() # 商品名、价格、优先级 # 将(优先级, 价格, 商品名)作为元组存储 # 优先级和价格转换为整数,便于比较 lst.append((int(v), int(p), s))# 多关键字排序:# 1. 优先级升序(V越小优先级越高)# 2. 价格升序# 3. 名字字典序升序lst.sort(key=lambda x: (x[0], x[1], x[2]))# 存储购买的商品名names = []# 依次检查每个商品for i in lst: # 如果预算足够购买当前商品 if m >= i[1]: names.append(i[2]) # 记录商品名 m -= i[1] # 扣除价格# 按照字典序排序购买的商品名names.sort()# 输出结果,每个商品名占一行for i in names: print(i)
编程学习的路径,是由无数个发现问题、分析问题、解决问题的环节串联而成。愿大家能享受这一过程,逐步成长为优秀的数字创造者。