题目描述
乔治正在完成自己的增肥计划。
为了增肥,乔治希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。乔治通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过1份,鱼类不宜吃超过1份,蛋类不宜吃超过1份,蔬菜类不宜吃超过2份。乔治想要在营养膳食的情况下吃到更多的脂肪,当然乔治的食量也是有限的。
输入输出格式
输入格式:
第一行包含三个正整数n(n≤200),m(m≤100)和k(k≤100)。表示乔治每顿饭最多可以吃m份食品,同时有n种食品供乔治选择,而这n种食品分为k类。第二行包含k个不超过10的正整数,表示可以吃1到k类食品的最大份数。接下来n行每行包括2个正整数,分别表示该食品的脂肪指数ai和所属的类别bi,其中ai≤100,bi≤k。
输出格式:
包括一个数字即乔治可以吃到的最大脂肪指数和。
输入输出样例
输入样例#1: 复制
6 6 3 3 3 2 15 1 15 2 10 2 15 2 10 2 5 3
输出样例#1: 复制
60
【胡乱分析】
做这道题的时候,我考虑了以下3个方面:1、每类食品能吃的最大份数,2、一共能吃多少份食品,3、如何才能吃到最多的脂肪
首先解决第3个方面,定义一个结构体,来存储每个食物的脂肪和类别。然后对结构体按照脂肪由高到低进行排序。然后第2个问
题就比较好办了。每吃完某种类型的食品,对应的食品份数就-1(为什么不设置那个以那个类别为下标为0,每吃完一份就+1呢,因为
我一开始这么做的但好像有错误),此处可以加个特判,份数减到0了就不能吃了。然后第一个问题更好办了。每吃完一份管他是哪一类
的食品就加1,要是与总份数相等了就break,就可以得到正解了。
我考试时写的代码有一个变量定义错了,却出乎意料的得了80,,,然后把那个变量改过来测了一下就AC了。。233
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<iostream> using namespace std; struct node { int ai,bi; }t[105]; bool cmp(node a,node b) { return a.ai >= b.ai; } int main() { //freopen("diet.in","r",stdin); //freopen("diet.out","w",stdout); int n,m,k,i,j,a[100],summ = 0,sumans = 0; scanf("%d%d%d",&n,&m,&k); for(i = 1;i <= k;i++) scanf("%d",&a[i]); for(i = 1;i <= n;i++) scanf("%d%d",&t[i].ai,&t[i].bi); sort(t+1,t+n+1,cmp); for(i = 1;i <= n;i++) { if(summ == m)break; if(a[t[i].bi] != 0) { sumans+=t[i].ai; a[t[i].bi]--; summ++; } } printf("%d",sumans); return 0; }