logo AlgoBeat OnlineJudge
登录 注册

DeepSeek 题解

作者: AlgoBeat 官方账号  ·  发布于 2026-06-30 17:11:34
已通过

[ABSEC0001] 健身餐 题解

题目概述

给定一顿健身餐中蛋白质、碳水、脂肪的克数,计算总热量并根据三大营养素的供能比例给出评级。


知识点考察

  • 基本算术运算
  • 浮点数精度处理
  • 条件分支判断(多级 if-else)
  • 格式化输出(保留一位小数)

解题思路

第一步:计算各部分热量

根据题目给出的换算关系:

营养素 每克热量
蛋白质 4 kcal
碳水
脂肪 9 kcal

因此:

蛋白质热量 = p × 4
碳水热量   = c × 4
脂肪热量   = f × 9
总热量     = 蛋白质热量 + 碳水热量 + 脂肪热量

第二步:计算供能比

供能比 = 该营养素热量 / 总热量,结果是一个小数(0~1 之间)。

蛋白质供能比 = 蛋白质热量 / 总热量
碳水供能比   = 碳水热量 / 总热量
脂肪供能比   = 脂肪热量 / 总热量

第三步:按顺序判定评级

题目明确要求判定顺序严格从上到下,因此使用 if-else if-else 结构:

  1. 蛋白质供能比 ≥ 0.4"High Protein"
  2. 否则,若 碳水供能比 ≥ 0.5"High Carb"
  3. 否则,若 脂肪供能比 ≥ 0.4"High Fat"
  4. 否则 → "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.0
High Protein
蛋白质占比最高
10 80 10 480.0
High Carb
碳水占比高
10 10 20 260.0
High Fat
脂肪占比高
25 25 10 290.0
Balanced
均未超标

希望这篇题解对您有帮助!如有任何疑问,欢迎在评论区留言讨论。

暂无评论

登录 后即可评论。