当前位置:首页>python>Python练习【GESP-202512-四级】建造、优先购买

Python练习【GESP-202512-四级】建造、优先购买

  • 2026-10-11 14:03:59
Python练习【GESP-202512-四级】建造、优先购买
GESP四级练习,函数与传参+递推,难度普及/提高。
编程题 1 :建造

题目描述

小 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区域:

  1. 区域内9个点的最大高度差 ≤ H

  2. 在满足条件1的区域中,找到海拔和最大的

解题步骤:

  1. 读取输入数据

  2. 遍历所有可能的3×3区域(左上角坐标范围:0到M-3行,0到N-3列)

  3. 对每个3×3区域:

    • 提取9个点的高度

    • 计算最大值和最小值

    • 检查是否满足条件:max-min ≤ H

    • 如果满足,计算9个点的和

  4. 记录满足条件的区域中的最大和

参考程序
# 读取输入: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)
编程题 2 :优先购买

题目描述

小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)

写给我的小同学们

编程学习的路径,是由无数个发现问题、分析问题、解决问题的环节串联而成。愿大家能享受这一过程,逐步成长为优秀的数字创造者。

最新文章

随机文章