其实我本来很不愿意做这个题解的,因为这道题真的太恶心了,转念一想以后会有更多人被这道题坑死,我还是来写一下吧
传送门点我点我
读完题我们知道了每一种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;
}