营养膳食

题目描述

乔治正在完成自己的增肥计划。

为了增肥,乔治希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。乔治通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过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;
}
原文地址:https://www.cnblogs.com/peppa/p/8586406.html