【GESP】C++一级真题 luogu-B4409 [GESP202509 一级] 商店折扣
GESP C++ 2025年9月一级真题,基础语句练习,难度★☆☆☆☆。
luogu-B4409 [GESP202509 一级] 商店折扣
题目要求
题目描述
商店正在开展促销活动,给出了两种方案的折扣优惠。第一种方案是购物满 $x$ 元减 $y$ 元;第二种方案是直接打 $n$ 折,也就是说价格变为原先的 $n/10$。这里的 $x, y, n$ 均是正整数,并且 $1 \leq y < x$,$1 \leq n < 10$。
需要注意的是,第一种方案中满减优惠只能使用一次。例如购物满 $10$ 元减 $3$ 元时,若挑选了价格总和为 $33$ 元的物品,只能减免 $3$ 元,需要支付 $30$ 元。
小明在商店挑选了价格总和为 $p$ 元的物品,结账时只能使用一种优惠方案。小明最少需要支付多少钱呢?
输入格式
四行,四个正整数 $x, y, n, p$,含义见题目描述。
输出格式
一行,一个小数,表示小明最少需要支付多少钱,保留两位小数。
输入输出样例 #1
输入 #1
1
2
3
4
8
7
9
10
输出 #1
1
3.00
输入输出样例 #2
输入 #2
1
2
3
4
8
7
2
11
输出 #2
1
2.20
说明/提示
对于所有测试点,保证 $1 \leq y < x \leq 100$,$1 \leq n < 10$,$1 \leq p \leq 100$。
题目分析
商店给出两种互斥优惠:满减(满 $x$ 减 $y$,仅一次)与直接打 $n$ 折。
目标是让总价 $p$ 在这两种方案中花最少的钱。
方案一(满减)
若 $p \geq x$,则实付 $p - y$;否则无法享受,实付 $p$。方案二(折扣)
实付 $p \times \frac{n}{10}$,注意结果可能是小数。取最优
比较两种方案的实付金额,选较小者即可。复杂度
仅常数次运算,时间 $O(1)$,空间 $O(1)$。输出细节
结果保留两位小数,C++ 可用printf("%.2f", ans)
或cout << fixed << setprecision(2) << ans
。
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cstdio>
int main() {
int x, y, n, p;
std::cin >> x >> y >> n >> p; // 读入四个正整数:满减门槛x、减免金额y、折扣n、总价p
int plan_one = p >= x ? p - y : p; // 方案一:若满x元则减y元,否则原价
double plan_two = p / 10.0 * n; // 方案二:直接打n折,即总价乘以n/10
double result = plan_one > plan_two ? plan_two : plan_one; // 取两种方案中更便宜的一个
printf("%.2f", result); // 保留两位小数输出最少需支付的金额
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
“luogu-”系列题目可在洛谷题库进行在线评测。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助