9月真题不新!用6月去旅行对照商店折扣,搞懂GESP一级最便宜问题
准备2026年12月GESP Python一级的同学,常觉得“每道题都不一样”。其实很多真题考查的是同一类能力:把生活问题抽象成几个方案,分别算价格,再比较出最小值。
本文用两道官方真题说明:
2026年6月一级《去旅行》:三种出行方案,取最便宜总价 2025年9月一级《商店折扣》:两种促销方案,取最少付款,保留两位小数
两题都属于GESP一级范围内的“变量输入—算术计算—分支判断—取最值—格式化输出”。
二、共同知识点:多方案比价模型
这类题的固定步骤只有四步:
读入参数:用 int(input())读整数;涉及小数结果再用浮点计算。逐方案算价:每种方案写成一个表达式。方案之间互不影响。 比较取最小:先设第一个方案为当前最优,再用 if逐个比;或学有余力用min()。按格式输出:整数直接 print;要求两位小数用格式化,如print("%.2f" % ans)或print(f"{ans:.2f}")。
GESP Python一级大纲覆盖变量、顺序/分支/循环、算术与比较运算符、输入输出、基础数据类型等 ,上述四步全部在范围内。
三、去旅行:三个整数方案取最小
【提交】
https://www.luogu.com.cn/problem/B4551
【问题描述】
快暑假了,小杨同学正在计划出去旅行,前往目的地的方案多种多样,小杨同学想知道如何前往目的地最便宜。
小杨同学住在 A 市,旅行目的地是 B 市,小杨同学前往目的地有三种方案:
从 A 市直飞 B 市; 从 A 市坐高铁到 C 市,然后坐飞机到 B 市; 从 A 市坐高铁到 C 市,然后坐高铁到 B 市。
请帮小杨同学求出最便宜的出行方案的价格。
【输入描述】
输入包含 行,每行一个正整数:
第 行的正整数表示「从 A 市直飞 B 市」的价格; 第 行的正整数表示「从 A 市坐高铁到 C 市」的价格; 第 行的正整数表示「从 C 市坐飞机到 B 市」的价格; 第 行的正整数表示「从 C 市坐高铁到 B 市」的价格。
【输出描述】
输出一个正整数,表示 种方式中,最便宜的出行方案的价格。
【样例输入1】
999105699588【样例输出1】
693【样例解释1】
方案 1. 直飞价格为 ;
方案 2. 高铁转飞机价格为 ;
方案 3. 高铁的价格为 ;
因此最便宜的价格是 。
【样例输入2】
9387【样例输出2】
9【样例解释2】
方案 1. 直飞价格为 ;
方案 2. 高铁转飞机价格为 ;
方案 3. 高铁的价格为 ;
因此最便宜的价格是 。
【数据范围】
所有输入均为正整数,且不超过 。
1. 题意简化
输入四行正整数:
a:A市直飞B市b:A市高铁到C市c:C市飞机到B市d:C市高铁到B市
三种方案总价:
方案1直飞: p1 = a方案2高铁+飞机: p2 = b + c方案3高铁+高铁: p3 = b + d
输出三者最小值。数据均为正整数且不超过10000 。
样例:输入999、105、699、588,三方案为999、804、693,输出693。
2. 一级打擂代码(推荐)
a = int(input())b = int(input())c = int(input())d = int(input())p1 = ap2 = b + cp3 = b + dbest = p1if p2 < best: best = p2if p3 < best: best = p3print(best)逻辑:先认为方案1最便宜,再用方案2、方案3依次挑战;谁更便宜就替换。无列表、无abs、无lambda,纯变量+if,适合零基础。
3. 学有余力简写
a = int(input()); b = int(input()); c = int(input()); d = int(input())print(min(a, b + c, b + d))min可接受多个参数返回最小值;一级若未讲函数,可先掌握打擂版。
四、商店折扣:两个方案,含条件与小数
【提交】
https://www.luogu.com.cn/problem/B4409
【问题描述】
商店正在开展促销活动,给出了两种方案的折扣优惠。第一种方案是购物满 元减 元;第二种方案是直接打 折,也就是说价格变为原先的 。这里的 均是正整数,并且 ,。
需要注意的是,第一种方案中满减优惠只能使用一次。例如购物满 元减 元时,若挑选了价格总和为 元的物品,只能减免 元,需要支付 元。
小明在商店挑选了价格总和为 元的物品,结账时只能使用一种优惠方案。小明最少需要支付多少钱呢?
【输入描述】
一行,四个正整数 ,含义见题目描述。
【输出描述】
一行,一个小数,表示小明最少需要支付多少钱,保留两位小数。
【样例输入1】
87910【样例输出1】
3.00【样例输入2】
87211【样例输出2】
2.20【提示】
对于所有测试点,保证 ,,。
1. 题意简化
输入四个正整数x, y, n, p:
满减方案:若总价 p >= x,实付p - y;否则不享受,实付p。满减只用一次。折扣方案:打 n折,实付p * n / 10(即原价乘以n/10)。两种只能选一种,输出较少金额,保留两位小数。
样例1:8 7 9 10 → 满8减7成立,满减方案10-7=3;折扣方案10×9/10=9;取3.00。样例2:8 7 2 11 → 满减11-7=4;折扣11×2/10=2.2;取2.20。
2. 一级分支代码
x = int(input())y = int(input())n = int(input())p = int(input())# 方案1:满减if p >= x: price1 = p - yelse: price1 = p# 方案2:n折price2 = p * n / 10.0# 取较小值if price1 < price2: ans = price1else: ans = price2print("%.2f" % ans)要点:
满减必须先判断 p >= x,不满不减,直接付原价。题目明确“满减只能使用一次”,例如33元、满10减3只减3元。折扣用 /10.0或*0.1都会得到浮点数;即使满减结果是整数,最后比较和输出都按小数处理。输出两位小数为一级常见格式要求,用 "%.2f"或f"{ans:.2f}"均可。
3. 若用min简写
x=int(input()); y=int(input()); n=int(input()); p=int(input())price1 = p - y if p >= x else pprice2 = p * n / 10.0print("%.2f" % min(price1, price2))三元表达式A if 条件 else B属于紧凑写法;零基础可先写完整if-else。
五、两题对照:为什么说是同一知识点
p>=x判断 | ||
结论:只要题目出现“几种方式都能达到目标、要最省钱/最少付款”,模板都是“分别算→比最小→按格式输出”。6月去旅行和9月商店折扣只是方案数量、是否含条件、是否出小数不同。
六、易错点(客观技术向)
去旅行别漏方案:方案2是 b+c、方案3是b+d,不是c+d。商店折扣满减别直接 p-y:不满x时减成负数或错误低价。折扣别写成 p*n/10用整数除法出问题:Python 3里p*n/10通常为浮点,但养成写/10.0或先转float(p)更稳。保留两位别只 round不格式化:round(2.2,2)内部是2.2,打印可能不显示2.20;要用"%.2f"。多方案比较别嵌套过多 if:打擂法“先best=方案1,再逐个if替换”最清晰,也最不容易写错。
七、小结
GESP一级“最便宜/最少付款”类题的本质不是数学难,而是程序化三步:
输入转变量 每方案一个公式,有阈值就加 if多公式比小,用打擂或 min,按题要求输出整数/两位小数
把去旅行和商店折扣各写一遍,再换数据自测,基本可覆盖12月一级同类题。
青少年编程竞赛交流
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的 #21天刷题打卡、 #GESP编程能力测评、 #青少年编程等级考试、 #教育部白名单比赛辅导 以及 #青少年编程组队竞赛 等活动。
