202509-商店折扣(luogu-B4409)

202509-商店折扣(luogu-B4409)

GESP C++ 2025年9月一级真题,基础语句练习,难度★☆☆☆☆。

luogu-B4409 [GESP202509 一级] 商店折扣

题目要求

题目描述

商店正在开展促销活动,给出了两种方案的折扣优惠。第一种方案是购物满 xx 元减 yy 元;第二种方案是直接打 nn 折,也就是说价格变为原先的 n/10n/10。这里的 x,y,nx, y, n 均是正整数,并且 1y<x1 \leq y < x1n<101 \leq n < 10

需要注意的是,第一种方案中满减优惠只能使用一次。例如购物满 1010 元减 33 元时,若挑选了价格总和为 3333 元的物品,只能减免 33 元,需要支付 3030 元。

小明在商店挑选了价格总和为 pp 元的物品,结账时只能使用一种优惠方案。小明最少需要支付多少钱呢?

输入格式

四行,四个正整数 x,y,n,px, y, n, p,含义见题目描述。

输出格式

一行,一个小数,表示小明最少需要支付多少钱,保留两位小数。

输入输出样例 #1

输入 #1
8
7
9
10
输出 #1
3.00

输入输出样例 #2

输入 #2
8
7
2
11
输出 #2
2.20

说明/提示

对于所有测试点,保证 1y<x1001 \leq y < x \leq 1001n<101 \leq n < 101p1001 \leq p \leq 100


题目分析

商店给出两种互斥优惠:满减(满 xxyy,仅一次)与直接打 nn 折。
目标是让总价 pp 在这两种方案中花最少的钱。

  1. 方案一(满减)
    pxp \geq x,则实付 pyp - y;否则无法享受,实付 pp

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

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

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

  5. 输出细节
    结果保留两位小数,C++ 可用 printf("%.2f", ans)cout << fixed << setprecision(2) << ans


示例代码

#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;
}

本文由coderli.com原创,按照CC BY-NC-SA 4.0 进行授权

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
最后更新于