1. 题目背景与需求分析
这道题目来自天梯赛的L1级别,主要考察基础的编程逻辑和条件判断能力。题目设定了一个非常生活化的场景:根据8岁儿童的身高体重数据,给出相应的营养建议。
题目给出了两个性别的标准值:
- 男生:身高130cm,体重27kg
- 女生:身高129cm,体重25kg
需要根据输入数据与标准值的比较,输出相应的建议。评价顺序是先身高后体重,输出结果用空格分隔。
2. 解题思路解析
2.1 输入输出设计
输入格式要求:
- 第一行是一个不超过10的正整数N,表示测试用例的数量
- 随后N行,每行包含三个数据:性别(1男/0女)、身高、体重
输出规则:
- 身高评价:
- 等于标准:wan mei!
- 高于标准:ni li hai!
- 低于标准:duo chi yu!
- 体重评价:
- 等于标准:wan mei!
- 高于标准:shao chi rou!
- 低于标准:duo chi rou!
2.2 逻辑结构设计
核心逻辑可以分为以下几个步骤:
- 读取测试用例数量N
- 循环N次,每次读取一组数据
- 根据性别选择对应的标准值
- 比较身高并输出评价
- 比较体重并输出评价
- 注意输出格式要求(空格分隔,换行结束)
3. 代码实现详解
3.1 基础代码结构
cpp复制#include<iostream>
using namespace std;
int main() {
int n, h, w, s;
cin >> n;
while(n--) {
cin >> s >> h >> w;
// 处理逻辑
}
return 0;
}
3.2 性别判断分支
根据输入的s值(1或0)决定使用哪组标准值:
cpp复制if(s == 1) {
// 男生处理逻辑
} else {
// 女生处理逻辑
}
3.3 身高评价逻辑
以男生为例(女生逻辑类似,标准值不同):
cpp复制if (h == 130) cout << "wan mei!" << " ";
else if (h > 130) cout << "ni li hai!" << " ";
else cout << "duo chi yu!" << " ";
3.4 体重评价逻辑
同样以男生为例:
cpp复制if (w == 27) cout << "wan mei!";
else if (w > 27) cout << "shao chi rou!";
else cout << "duo chi rou!";
cout << endl; // 换行结束当前测试用例
4. 完整代码实现
将上述各部分组合起来,得到完整解决方案:
cpp复制#include<iostream>
using namespace std;
int main() {
int n, h, w, s;
cin >> n;
while(n--) {
cin >> s >> h >> w;
if(s == 1) { // 男生
if (h == 130) cout << "wan mei!" << " ";
else if (h > 130) cout << "ni li hai!" << " ";
else cout << "duo chi yu!" << " ";
if (w == 27) cout << "wan mei!" << endl;
else if (w > 27) cout << "shao chi rou!" << endl;
else cout << "duo chi rou!" << endl;
} else { // 女生
if (h == 129) cout << "wan mei!" << " ";
else if (h > 129) cout << "ni li hai!" << " ";
else cout << "duo chi yu!" << " ";
if (w == 25) cout << "wan mei!" << endl;
else if (w > 25) cout << "shao chi rou!" << endl;
else cout << "duo chi rou!" << endl;
}
}
return 0;
}
5. 代码优化与注意事项
5.1 代码优化建议
-
使用常量定义标准值:可以使代码更易读和维护
cpp复制const int BOY_HEIGHT = 130; const int BOY_WEIGHT = 27; const int GIRL_HEIGHT = 129; const int GIRL_WEIGHT = 25; -
提取评价逻辑为函数:减少重复代码
cpp复制void evaluate(int value, int standard, const string& equal, const string& greater, const string& less) { if(value == standard) cout << equal; else if(value > standard) cout << greater; else cout << less; }
5.2 常见错误与调试技巧
-
输出格式错误:
- 确保身高和体重评价之间有且只有一个空格
- 每个测试用例输出后要换行
-
逻辑判断顺序错误:
- 必须先判断等于的情况,再判断大于/小于
- 如果先判断大于或小于,等于的情况也会被包含
-
变量类型选择:
- 题目保证输入都是正整数且不超过200,使用int足够
- 如果数据范围更大,可能需要考虑long long
6. 算法复杂度分析
- 时间复杂度:O(N),只需要线性处理每个测试用例
- 空间复杂度:O(1),只使用了固定数量的变量
7. 扩展思考
7.1 更灵活的标准值处理
实际应用中,标准值可能不是固定的,可以考虑:
- 从配置文件读取标准值
- 根据不同年龄段设置不同标准
- 考虑地区差异等因素
7.2 输出建议的扩展
当前的营养建议比较简单,可以扩展为:
- 更具体的饮食建议
- 运动建议
- 综合健康评估
7.3 异常输入处理
虽然题目保证输入合法,但实际应用中需要考虑:
- 性别输入不是0或1
- 身高体重为负数或超出合理范围
- 输入格式错误等情况
8. 实际应用场景
这类算法在实际中可以应用于:
- 儿童健康筛查系统
- 学校体检数据分析
- 健康类APP的功能模块
- 儿科医疗辅助系统
只需要根据实际需求调整标准值和评价逻辑即可。
9. 总结与个人体会
这道题目虽然简单,但很好地体现了编程中条件判断的核心思想。在实际编写时,我建议:
- 先理清所有判断条件和分支
- 注意代码的重复部分,考虑是否可以提取为函数
- 特别注意输出格式的要求
- 测试时要考虑边界情况(如正好等于标准值)
对于初学者来说,这类题目是练习if-else语句的绝佳材料。在解决后,可以尝试用不同的方法实现,比如使用switch语句或三元运算符,比较各种写法的优缺点。