✏️ 纠错
第 140 题 / 共 155 题

题目描述

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

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

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

输入格式

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

输出格式

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

输入输出样例

输入 #1

8
7
9
10

输出 #1

3.00

输入 #2

8
7
2
11

输出 #2

2.20

说明/提示

对于所有测试点,保证 1≤y<x≤100,1≤n<10,1≤p≤100。

📝 题目解析
考纲知识点

分支结构、基本运算、输入输出语句

解题思路
  1. 满减方案(方案一):当购物总金额 p 大于等于满减门槛 x 时,可减免 y 元;若 p 小于 x,则无法使用满减,需支付原价 p。

  2. 折扣方案(方案二):直接按原价的 n/10 计算最终支付金额(例如 n=9 对应 9 折,即原价的 90%)。

  3. 比较两种方案的结果,取较小值,并按要求保留两位小数输出。

    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main() {
        int x, y, n, p;
        cin >> x >> y >> n >> p;
        double a1, a2;
        // 方案一:满减
        if (p >= x) {
            a1 = p - y;
        } else {
            a1 = p;
        }
        // 方案二:折扣
        a2 = p * n / 10.0;
        // 取最小值
        double min_pay = (a1 < a2) ? a1 : a2;
        // 保留两位小数输出
        cout << fixed << setprecision(2) << min_pay << endl;
        return 0;
    }