营养膳食-P2095

其实我本来很不愿意做这个题解的,因为这道题真的太恶心了,转念一想以后会有更多人被这道题坑死,我还是来写一下吧
传送门点我点我
读完题我们知道了每一种type的食物都有对应的脂肪和食用限制,然后搞一个结构体排序贪心一下不就好了吗
路过的wzm:啊对对对,啊非常对,非常对
读对了题目我们就可以开始做了
首先搞一个结构体用来存储每一个食物的脂肪和品种,并且定义一个结构体数组来存储每一个食物,如下

struct food{
	int fat,type;
}th[201]; 

然后定义一下基础变量(存储食物种类数的k,存储Mr.L可以吃的食物数量m,以及餐桌上事物的数量n,以及用来存储每种种类可以吃的数量的数组cnet,以及用来统计最后输出的zf)

int n,m,k,cnet[101]={},zf=0;

并且按照题意写一下输入

cin>>n>>m>>k;
	for(int i=1;i<=k;i++)cin>>cnet[i];
	for(int i=1;i<=n;i++){
		cin>>th[i].fat>>th[i].type;
	}

由于是一道典型的贪心,这道题肯定少不了排序,至于怎么排序,就这样排序

sort(th+1,th+n+1,cmp);

这个时候有人就发现:cmp在哪!!!
那么这道题的贪心就是脂肪越高越好,那肯定直接按照food.fat来排序
如下:

bool cmp(food a,food b){
	return a.fat>b.fat;
}

最后循环遍历就行了
思路:要是Mr.L已经饱了,就不能再吃了
要是可以吃,那就需要先看这个食物类别还能不能吃,要是可以吃,那必须得吃【为了增肥】
并且吃进去了就要统计进脂肪
由于题目还没有说每道菜的数量,所有就假设每道菜都可以无限吃

for(int i=1;i<=n;i++){
		if(m==0)break;
		if(cnet[th[i].type]){
			while(cnet[th[i].type]&&m){
				--m;
				--cnet[th[i].type];
				zf+=th[i].fat;
			}
		}
	}

好了完整代码送给你,送给你嘿嘿

#include<bits/stdc++.h>
using namespace std;
struct food{
	int fat,type;
}th[201]; 
bool cmp(food a,food b){
	return a.fat>b.fat;
}
int main(){
	int n,m,k,cnet[101]={},zf=0;
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)cin>>cnet[i];
	for(int i=1;i<=n;i++){
		cin>>th[i].fat>>th[i].type;
	}
	sort(th+1,th+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(m==0)break;
		if(cnet[th[i].type]){
			while(cnet[th[i].type]&&m){
				--m;
				--cnet[th[i].type];
				zf+=th[i].fat;
			}
		}
	}
	cout<<zf;
	return 0;
}

乍一看,十分???

而且,样例直接90?

写出这个代码的我也是一头雾水,我去讨论区看了一眼,结果发现

每道菜居然只有一份!!!

放心,我已经向小粉兔报告了错误,等待处理

那么我们怎么改呢
其实改一下很简单的,只能吃一次就代表当中不能使用while循环下去了,需要使用if分支【因为只能吃一次】
所以将while修改成

if(cnet[th[i].type]&&m){
	m--;
	zf+=th[i].fat;
	cnet[th[i].type]--;
}

正确的AC代码,也是一样,送给你送给你嘿嘿
提示:
抄袭题解一时爽,后来棕名两行泪

#include<bits/stdc++.h>
using namespace std;
struct food{
	int fat,type;
}th[201]; 
bool cmp(food a,food b){
	return a.fat>b.fat;
}
int main(){
	int n,m,k,cnet[101]={},zf=0;
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)cin>>cnet[i];
	for(int i=1;i<=n;i++){
		cin>>th[i].fat>>th[i].type;
	}
	sort(th+1,th+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(m==0)break;
		if(cnet[th[i].type]){
			if(cnet[th[i].type]&&m){
				m--;
				zf+=th[i].fat;
				cnet[th[i].type]--;
			}
		}
	}
	cout<<zf;
	return 0;
}

这要是不是100分那就是上面那个while一百分【我不确定小粉兔收到错误后是修改样例和测试点还是修改题面】

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
饮食营养搭配系统的流程图如下: 1. 用户输入个人信息和目标:用户首先提供个人信息,包括性别、年龄、身高、体重等。然后用户还需要指定自己的饮食目标,比如减肥、增肌或维持健康等。 2. 分析用户需求:系统根据用户提供的个人信息和目标,进行分析和计算,确定用户所需的能量摄入量、各种营养素的摄入量以及饮食比例。 3. 提供饮食建议:系统根据用户的需求和分析结果,生成饮食建议。这些建议可能包括每日所需的热量摄入量、各类营养素的推荐摄入量、食物组合和搭配建议等。 4. 提供食谱推荐:系统根据用户的需求和分析结果,生成适合用户的食谱推荐。这些食谱可能包括早餐、午餐、晚餐和加餐的具体食物组合和搭配。 5. 提供食材推荐:系统根据用户的需求和分析结果,生成适合用户的食材推荐。这些食材可能包括各类蔬菜、水果、肉类、豆类、谷物等,以满足用户所需的营养素摄入。 6. 提供饮食记录和分析:系统可以提供用户的饮食记录功能,用户可以记录自己每日的饮食情况。系统还可以对用户的饮食记录进行分析,提供反馈和改进建议。 7. 提供健康监测和反馈:系统可以根据用户的饮食记录和个人信息,进行健康监测和评估。系统可以提供用户的健康状况反馈,比如体重变化、营养摄入不足或过量等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值