B4409 [GESP202509 一级] 商店折扣

· · 题解

欢迎报名洛谷网校,报名课程可以获得对应组别的知识点讲解与答疑服务,期待和大家一起进步!点击图片即可报名。

:::align{center} :::

在这里,小明有两种选择,我们只需要分别计算出每种方案下他需要支付的金额,然后取其中较小的一个作为最终答案即可。

首先,我们来看第一种方案:满 x 元减 y 元。这是一个有条件的优惠。我们需要先判断小明挑选的物品总价 p 是否达到了满减的门槛 x。如果 p 大于或等于 x,那么他就可以享受优惠,实际需要支付的金额就是 p - y。反之,如果他的总价 p 还没有达到 x,那么这个优惠就无法使用,他需要支付原价 p

参考代码:

// c1 代表方案一的最终价格,怎么存下一个小数呢?
________ c1;
if (________) ________; // 满足条件,减去 y
else ________;

接着,我们分析第二种方案:直接打 n 折。打 n 折的意思是,最终价格是原价的 n/10。所以,在这种方案下,小明需要支付的金额就是 p \times (n / 10.0)。这里需要特别注意,为了得到一个精确的小数结果,我们在计算时应该使用 10.0 而不是 10,这样可以确保 C++ 进行的是浮点数除法,而不是会丢失小数部分的整数除法。

参考代码:

// c2 代表方案二的最终价格
________ c2 = ________;

现在,我们已经分别计算出了两种方案下需要支付的金额。最后一步,就是比较这两个金额的大小,选择那个更小的值,就是小明最少需要支付的钱。由于最终结果要求保留两位小数,我们在输出时可以使用 C++ 的格式化输出功能来实现,也可以使用 printf 实现。

参考代码:

// ans 是两种方案中的最低价格
________ ans;
if (________) ________; // 让 ans 成为 c1 和 c2 中的较小值
else ________;  
________ // 输出 ans,保留 2 位小数