文章

【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$ 在这两种方案中花最少的钱。

  1. 方案一(满减)
    若 $p \geq x$,则实付 $p - y$;否则无法享受,实付 $p$。

  2. 方案二(折扣)
    实付 $p \times \frac{n}{10}$,注意结果可能是小数。

  3. 取最优
    比较两种方案的实付金额,选较小者即可。

  4. 复杂度
    仅常数次运算,时间 $O(1)$,空间 $O(1)$。

  5. 输出细节
    结果保留两位小数,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),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权