小明购物花费 (p) 元,有两种优惠方案可以选:
由于只能选择其中一种方案,小明的最少支付金额就是这两种方案计算结果中的较小值。输出需保留两位小数。
题目数据范围很小((x,y,n,p \le 100)),直接计算并比较即可。
对于满减方案,计算时需要注意“只能减一次”的条件,即无论购物金额多大,折扣金额最多只有 (y) 元。因此我们可以用条件判断:如果 (p \ge x),支付 (p - y);否则支付 (p)。
对于打折方案,由于 (n) 是整数且 (1 \le n < 10),打折后的金额为 (p \times n / 10)。这个结果可能不是整数,因此需要使用浮点数类型(如 double)来存储,从而保留小数。
最后将两种方案的结果取最小值,并按两位小数输出。
double 类型);算法仅包含常数次运算和一次输出,时间复杂度为 (\mathcal{O}(1))。对于本题的数据范围完全足够。
cpp1#include <algorithm> 2#include <cstdio> 3using namespace std; 4int x, y, n, p; 5double a1, a2; 6int main() { 7 scanf("%d%d%d%d", &x, &y, &n, &p); 8 a1 = p; 9 if (a1 >= x) a1 -= y; 10 a2 = p * 0.1 * n; 11 printf("%.2lf\n", min(a1, a2)); 12 return 0; 13}
代码解释:
#include <algorithm>:为了使用 min 函数。#include <cstdio>:为了使用 scanf 和 printf。这里 cstdio 是 C++ 中 C 标准输入输出库的头文件,通常写为 <cstdio> 或 <cstdio>,用法相同。using namespace std;:引入标准命名空间,方便直接使用 min、scanf、printf 等。int x, y, n, p;:定义四个整数变量,分别存储满减门槛、满减金额、折扣分子、购物总价。double a1, a2;:用双精度浮点数存储两种方案应付金额。scanf("%d%d%d%d", &x, &y, &n, &p);:从标准输入读取四个整数。a1 = p; if (a1 >= x) a1 -= y;:计算满减方案。先把原始价格赋给 a1,如果达到满减条件则减去 y。a2 = p * 0.1 * n;:计算打折方案。0.1 * n 等价于 n / 10.0,直接得到折扣后价格。printf("%.2lf\n", min(a1, a2));:使用 min 取最小应付金额,并通过 %.2lf 保留两位小数输出。return 0;:程序正常结束。注意: 打折计算中的 0.1 * n 是浮点数运算,因此 a2 会自动转为 double。即使打折后的金额为整数,输出时也会显示两位小数(如 20.00),符合题目要求。