营养膳食-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一百分【我不确定小粉兔收到错误后是修改样例和测试点还是修改题面】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值