专栏文章

B4409 [GESP202509 一级] 商店折扣

B4409题解参与者 11已保存评论 12

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
9 条
当前快照
1 份
快照标识符
@mink770q
此快照首次捕获于
2025/12/02 03:45
3 个月前
此快照最后确认于
2025/12/02 03:45
3 个月前
查看原文
欢迎报名洛谷网校,期待和大家一起进步!
在这里,小明有两种选择,我们只需要分别计算出每种方案下他需要支付的金额,然后取其中较小的一个作为最终答案即可。
首先,我们来看第一种方案:满 xx 元减 yy 元。这是一个有条件的优惠。我们需要先判断小明挑选的物品总价 pp 是否达到了满减的门槛 xx。如果 pp 大于或等于 xx,那么他就可以享受优惠,实际需要支付的金额就是 pyp - y。反之,如果他的总价 pp 还没有达到 xx,那么这个优惠就无法使用,他需要支付原价 pp
接着,我们分析第二种方案:直接打 nn 折。打 nn 折的意思是,最终价格是原价的 n/10n/10。所以,在这种方案下,小明需要支付的金额就是 p×(n/10.0)p \times (n / 10.0)。这里需要特别注意,为了得到一个精确的小数结果,我们在计算时应该使用 10.010.0 而不是 1010,这样可以确保 C++ 进行的是浮点数除法,而不是会丢失小数部分的整数除法。
现在,我们已经分别计算出了两种方案下需要支付的金额。最后一步,就是比较这两个金额的大小,选择那个更小的值,就是小明最少需要支付的钱。由于最终结果要求保留两位小数,我们在输出时可以使用 C++ 的格式化输出功能来实现,也可以使用 printf("%.2lf") 的形式实现。
参考代码:
CPP
// c1 代表方案一的最终价格
double c1;
if (p >= x) c1 = p - y; // 满足条件,减去 y
else c1 = p; 
// c2 代表方案二的最终价格
double c2 = p * (n / 10.0);
// ans 是两种方案中的最低价格
double ans = min(c1, c2);
cout << fixed << setprecision(2) << ans << endl;
// 也可以写作:printf("%.2lf", ans);

评论

12 条评论,欢迎与作者交流。

正在加载评论...