[ABSEC0001] 健身餐 题解
题目概述
给定一顿健身餐中蛋白质、碳水、脂肪的克数,计算总热量并根据三大营养素的供能比例给出评级。
知识点考察
- 基本算术运算
- 浮点数精度处理
- 条件分支判断(多级 if-else)
- 格式化输出(保留一位小数)
解题思路
第一步:计算各部分热量
根据题目给出的换算关系:
| 营养素 | 每克热量 |
|---|---|
| 蛋白质 | 4 kcal |
| 碳水 | |
| 脂肪 | 9 kcal |
因此:
蛋白质热量 = p × 4
碳水热量 = c × 4
脂肪热量 = f × 9
总热量 = 蛋白质热量 + 碳水热量 + 脂肪热量
第二步:计算供能比
供能比 = 该营养素热量 / 总热量,结果是一个小数(0~1 之间)。
蛋白质供能比 = 蛋白质热量 / 总热量
碳水供能比 = 碳水热量 / 总热量
脂肪供能比 = 脂肪热量 / 总热量
第三步:按顺序判定评级
题目明确要求判定顺序严格从上到下,因此使用 if-else if-else 结构:
- 若
蛋白质供能比 ≥ 0.4→"High Protein" - 否则,若
碳水供能比 ≥ 0.5→"High Carb" - 否则,若
脂肪供能比 ≥ 0.4→"High Fat" - 否则 →
"Balanced"
⚠️ 注意:顺序很重要。例如,一份同时满足 High Protein 和 High Carb 条件的餐食,必须输出 High Protein,因为它是第一个匹配的规则。
代码实现
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
int p, c, f;
cin >> p >> c >> f;
double pro_kcal = p * 4.0;
double carb_kcal = c * 4.0;
double fat_kcal = f * 9.0;
double total = pro_kcal + carb_kcal + fat_kcal;
// 输出总热量,保留 1 位小数
cout << fixed << setprecision(1) << total << '\n';
double pro_ratio = pro_kcal / total;
double carb_ratio = carb_kcal / total;
double fat_ratio = fat_kcal / total;
if (pro_ratio >= 0.4) {
cout << "High Protein\n";
} else if (carb_ratio >= 0.5) {
cout << "High Carb\n";
} else if (fat_ratio >= 0.4) {
cout << "High Fat\n";
} else {
cout << "Balanced\n";
}
return 0;
}
Python
p, c, f = map(int, input().split())
pro_kcal = p * 4
carb_kcal = c * 4
fat_kcal = f * 9
total = pro_kcal + carb_kcal + fat_kcal
print(f"{total:.1f}")
pro_ratio = pro_kcal / total
carb_ratio = carb_kcal / total
fat_ratio = fat_kcal / total
if pro_ratio >= 0.4:
print("High Protein")
elif carb_ratio >= 0.5:
print("High Carb")
elif fat_ratio >= 0.4:
print("High Fat")
else:
print("Balanced")
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int p = sc.nextInt();
int c = sc.nextInt();
int f = sc.nextInt();
double proKcal = p * 4.0;
double carbKcal = c * 4.0;
double fatKcal = f * 9.0;
double total = proKcal + carbKcal + fatKcal;
System.out.printf("%.1f\n", total);
double proRatio = proKcal / total;
double carbRatio = carbKcal / total;
double fatRatio = fatKcal / total;
if (proRatio >= 0.4) {
System.out.println("High Protein");
} else if (carbRatio >= 0.5) {
System.out.println("High Carb");
} else if (fatRatio >= 0.4) {
System.out.println("High Fat");
} else {
System.out.println("Balanced");
}
sc.close();
}
}
复杂度分析
- 时间复杂度:,仅进行常数次算术运算和比较。
- 空间复杂度:,仅使用若干变量存储中间结果。
易错点提醒
| 易错点 | 说明 |
|---|---|
| ❌ 整数除法 | 计算供能比时,若使用整数除法会导致结果为 0。必须使用浮点数运算。 |
| ❌ 输出格式 | 总热量要求四舍五入保留 1 位小数,注意使用 fixed << setprecision(1) 或 printf("%.1f")。 |
| ❌ 判定顺序 | 必须严格按照题目顺序,不能自行调整优先级(例如先判断 High Carb)。 |
测试用例
| 输入 | 输出 | 说明 |
|---|---|---|
50 20 10 |
370.0High Protein |
蛋白质占比最高 |
10 80 10 |
480.0High Carb |
碳水占比高 |
10 10 20 |
260.0High Fat |
脂肪占比高 |
25 25 10 |
290.0Balanced |
均未超标 |
希望这篇题解对您有帮助!如有任何疑问,欢迎在评论区留言讨论。
暂无评论