甜点课

分析问题

题目要求根据现有原料数量,按甜点编号顺序制作甜点。每个甜点需消耗特定数量的原料,制作后需扣除对应原料。需依次计算每个甜点能制作的最大数量,并更新原料剩余量。

首先,题目中的五种甜点的制作顺序是按编号从小到大进行的。也就是说,先尽可能多地做巧克力曲奇(第一个),剩下的原料再做奶油蛋糕(第二个),依此类推。每个甜点需要的原料各不相同,所以每次制作某个甜点时,必须检查当前剩余的原料是否足够,并且每次制作后要扣除相应的原料数量。

那我的思路应该是这样的:按照1到5的顺序处理每个甜点,对于每个甜点,计算用当前剩余原料最多能做多少个。然后更新原料的数量,继续处理下一个甜点。

建立模型

1.输入:四个整数,表示原料A、B、C、D的初始数量。

2.甜点需求:五种甜点的原料进行循环判断。

3.处理逻辑

  • 对每个甜点,遍历其原料需求。
  • 计算当前原料能支持的最大制作数量(取所有原料的最小值)。
  • 扣除已使用的原料,更新剩余原料。

4.输出:按顺序输出五种甜点的制作数量。

编写代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,d,cnt=0;
    cin>>a>>b>>c>>d;
    bool f=true;//标记 flag
    //巧克力曲奇
    while(f){
        if(a>=2 && b>=1 && d>=2)
            {//扣去原材料,制作出一个 
                a-=2;
                b-=1;
                d-=2;
                cnt++;
            }
        else //材料不足,将标记设置为假,退出循环
        {
            f=false; 
        }
    }
    //奶油蛋糕
    cout<<cnt<<endl; 
    cnt=0;//清零,开始重新统计 
    f=true; 
    while(f){
        if(a>=1 && b>=1 &&c>=1 && d>=1){
            a--;
            b--;
            c--;
            d--;
            cnt++;
        }else{
            f=false;
        }
    }
    cout<<cnt<<endl; 
    //甜甜圈,需要原料:CCD
    cnt=0;//清零,开始重新统计 
    f=true;
    while(f){
        if(c>=2 && d>=1){
            c-=2;
            d--;
            cnt++;
        }else{
            f=false;
        }
    }
    cout<<cnt<<endl; 
    //糖人
    f=true;
    cnt=0;//清零,开始重新统计 
    while(f){
        if(b>=3){
            b-=3;
            cnt++;
        }else{
            f=false;
        }
    } 
    cout<<cnt<<endl; 
    //巧克力派 
    cnt=0;//清零,开始重新统计 
    f=true;
    while(f){
        if(a>=1 && d>=1){
            a--;
            d--;
            cnt++;
        }else{
            f=false;
        }
    }
    cout<<cnt<<endl; 
    return 0;
} 

保存 编译 运行

拓展:使用数学方法优化代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b, c, d;
    cin >> a >> b >> c >> d;

    int cookie = 0, cake = 0, donut = 0, candy = 0, pie = 0;

    // 巧克力曲奇:2A, 1B, 0C, 2D
    int max_cookie = a / 2;
    if (b < max_cookie) max_cookie = b;
    if (d / 2 < max_cookie) max_cookie = d / 2;
    cookie = max_cookie;
    a -= 2 * cookie;
    b -= cookie;
    d -= 2 * cookie;

    // 奶油蛋糕:1A, 1B, 1C, 1D
    int max_cake = a;
    if (b < max_cake) max_cake = b;
    if (c < max_cake) max_cake = c;
    if (d < max_cake) max_cake = d;
    cake = max_cake;
    a -= cake;
    b -= cake;
    c -= cake;
    d -= cake;

    // 甜甜圈:0A, 0B, 2C, 1D
    int max_donut = c / 2;
    if (d < max_donut) max_donut = d;
    donut = max_donut;
    c -= 2 * donut;
    d -= donut;

    // 糖人:0A, 3B, 0C, 0D
    int max_candy = b / 3;
    candy = max_candy;
    b -= 3 * candy;

    // 巧克力派:1A, 0B, 0C, 1D
    int max_pie = a;
    if (d < max_pie) max_pie = d;
    pie = max_pie;
    a -= pie;
    d -= pie;

    cout << cookie << " " << cake << " " << donut << " " << candy << " " << pie << endl;

    return 0;
}