题解:洛谷 P5714 肥胖问题
【题目来源】
【题目描述】
BMI 指数是国际上常用的衡量人体胖瘦程度的一个标准,其算法是 \(\frac{m}{h^2}\),其中 \(m\) 是指体重(千克),\(h\) 是指身高(米)。不同体型范围与判定结果如下:
- 小于 \(18.5\):体重过轻,输出
Underweight; - 大于等于 \(18.5\) 且小于 \(24\):正常体重,输出
Normal; - 大于等于 \(24\):肥胖,不仅要输出 BMI 值(使用
cout的默认精度),然后换行,还要输出Overweight;
现在给出体重和身高数据,需要根据 BMI 指数判断体型状态并输出对应的判断。
对于非 C++ 语言,在输出时,请四舍五入保留六位有效数字输出,如果小数部分存在后缀 \(0\),不要输出后缀 \(0\)。
请注意,保留六位有效数字不是保留六位小数。例如 \(123.4567\) 应该输出为 \(123.457\),\(5432.10\) 应该输出为 \(5432.1\)。
【输入】
共一行。
第一行,共 \(2\) 个浮点数,\(m,h\),分别表示体重(单位为 kg),身高(单位为 m)。
【输出】
输出一行一个字符串,表示根据 BMI 的对应判断。特别地,对于 Overweight 情况的特别处理请参照题目所述。
【输入样例】
70 1.72
【输出样例】
Normal
【核心思想】
-
问题分析:给定体重 \(m\)(kg)和身高 \(h\)(m),计算 BMI 指数 \(= \frac{m}{h^2}\),根据数值范围判断体型:小于 \(18.5\) 输出
Underweight,\([18.5, 24)\) 输出Normal,大于等于 \(24\) 先输出 BMI 值再输出Overweight。 -
算法选择:
- 直接计算 + 分支判断:按公式计算 BMI,用
if-else if-else链根据范围输出对应结果
- 直接计算 + 分支判断:按公式计算 BMI,用
-
关键步骤:
- 读入数据:
cin >> m >> h - 计算 BMI:
bmi = m / (h * h) - 分类输出:
- 若
bmi < 18.5:输出"Underweight" - 否则若
bmi < 24:输出"Normal"(隐含bmi >= 18.5) - 否则:输出
bmi换行"Overweight"
- 若
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),单次计算和判断
- 空间复杂度:\(O(1)\),仅需三个变量
-
健康指标计算的核心思想:
- 连续区间划分:BMI 范围被划分为三个连续区间,用
if-else if链自然处理边界 - 浮点比较:直接使用
<比较浮点数,题目数据保证不会出现边界精度问题 - 特殊输出格式:
Overweight情况需先输出数值再输出标签,与其他两类不同 - 适用于指标计算、区间分类、健康评估类入门问题
- 连续区间划分:BMI 范围被划分为三个连续区间,用
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int m; // 定义变量:体重m(kg)
double bmi, h; // 定义变量:bmi指数,身高h(m)
cin >> m >> h; // 输入体重和身高
// 计算BMI指数(体重除以身高的平方)
bmi = m / (h * h);
// 根据BMI值判断体型分类
if (bmi < 18.5)
{
// BMI < 18.5:体重过轻
cout << "Underweight";
}
else if (bmi < 24)
{
// 18.5 ≤ BMI < 24:正常体重
cout << "Normal";
}
else
{
// BMI ≥ 24:超重(输出BMI值+分类)
cout << bmi << endl << "Overweight";
}
return 0; // 程序正常结束
}
【运行结果】
70 1.72
Normal
浙公网安备 33010602011771号