
分析问题
题目要求根据现有原料数量,按甜点编号顺序制作甜点。每个甜点需消耗特定数量的原料,制作后需扣除对应原料。需依次计算每个甜点能制作的最大数量,并更新原料剩余量。
首先,题目中的五种甜点的制作顺序是按编号从小到大进行的。也就是说,先尽可能多地做巧克力曲奇(第一个),剩下的原料再做奶油蛋糕(第二个),依此类推。每个甜点需要的原料各不相同,所以每次制作某个甜点时,必须检查当前剩余的原料是否足够,并且每次制作后要扣除相应的原料数量。
那我的思路应该是这样的:按照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;
}