小杨需要寄送一个快递,快递公司提供了两种计费方式:
快递公司会选择价格较低的一种方式作为最终运费。已知 V、G、M、N 均为正数且不超过 1000,输入和输出都是一位小数的浮点数。需要输出最终运费,保留一位小数。
这是一道非常简单的模拟题,只需要根据题意计算两种运费,然后取最小值输出即可。
设体积运费为 cost_by_volume,重量运费为 cost_by_weight。
V、G、M、N。cost_by_volume = V / 2.0 (等价于 0.5 × V)。G 是否小于 300,
G < 300,则 cost_by_weight = M;cost_by_weight = N。answer = min(cost_by_volume, cost_by_weight)。使用 double 类型存储所有浮点数即可,数据范围在 0~1000 之间,计算过程不会出现精度问题。
算法就是直接模拟计算过程,全部由基本运算构成,不涉及任何复杂数据结构或算法。可以用条件运算符 (条件) ? 值1 : 值2 来简洁地表达重量运费的选择,再用 min 函数或条件表达式选择最终的结果。
整个程序只进行常数次的读入、比较和输出操作,因此时间复杂度为 O(1),空间复杂度也是 O(1)。
下面是 C++ 的参考代码。请注意,原提示中给出的参考代码头文件存在笔误,已修正为正确的头文件组合,同时我们给出了带 cout 格式化输出的另一种写法供参考。
cpp1#include <cstdio> 2 3int main() { 4 double V, G, M, N; 5 scanf("%lf%lf%lf%lf", &V, &G, &M, &N); 6 7 double cost_by_volume = V / 2.0; 8 double cost_by_weight = (G < 300) ? M : N; 9 double answer = (cost_by_volume < cost_by_weight) ? cost_by_volume : cost_by_weight; 10 11 printf("%.1f\n", answer); 12 return 0; 13}
代码解释:
scanf 读入四个 double 类型的值,%lf 是 double 的格式说明符。cost_by_volume = V / 2.0 计算体积运费。cost_by_weight 通过条件运算符判断重量是否小于 300 克,进而选择 M 或 N。answer 使用条件运算符取两者中较小的值。printf("%.1f", answer) 输出保留一位小数的结果。cpp1#include <iostream> 2#include <iomanip> 3using namespace std; 4 5int main() { 6 double V, G, M, N; 7 cin >> V >> G >> M >> N; 8 9 double cost_by_volume = V / 2.0; 10 double cost_by_weight = (G < 300) ? M : N; 11 double answer = min(cost_by_volume, cost_by_weight); 12 13 cout << fixed << setprecision(1) << answer << endl; 14 return 0; 15}
代码解释:
cin 读入数据。min 函数(定义在 <algorithm> 头文件或 std 命名空间中)选取较小值。fixed 和 setprecision(1) 操控输出格式,使结果保留一位小数。无论是哪种写法,核心逻辑完全一致,同学们可以根据自己的习惯选择使用。
float 或 double,推荐使用 double 以得到更高精度。>=300 的判断不要写反。printf,记得写 %.1f;如果用 cout,务必将 fixed 和 setprecision(1) 配合使用,否则 setprecision 会控制有效数字位数而非小数位数。V * 0.5 或者 V / 2.0。注意不要写成 V / 2,否则当 V 是整数类型时会产生整除。总的来说,这是一道基础的模拟题,考察对浮点数输入、条件判断和格式化输出的掌握,适合初学者练习。