P2095 营养膳食

发布于:2022-12-02 ⋅ 阅读:(711) ⋅ 点赞:(0)

题目描述

Mr.L 正在完成自己的增肥计划。

为了增肥,Mr.L 希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。

Mr.L 通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过 1 份,鱼类不宜吃超过 1 份,蛋类不宜吃超过 1 份,蔬菜类不宜吃超过 2 份。

Mr.L 想要在营养膳食的情况下吃到更多的脂肪,当然 Mr.L 的食量也是有限的。

输入格式

第一行包含三个正整数 n,m 和 k。表示 Mr.L 每顿饭最多可以吃 m 份食品,同时有 n 种食品供 Mr.L 选择,而这 n种食品分为 k 类。

第二行包含 k 个不超过 10 的正整数,表示可以吃 1到 k 类食品的最大份数。

接下来 n 行每行包括 2 个正整数,分别表示该食品的脂肪指数ai​ 和所属的类别 bi​。

输出格式

包括一个数字即 Mr.L 可以吃到的最大脂肪指数和。

输入输出样例

输入 #1                                    输出 #1

6 3 3                                        60

3 3 2

15 1

15 2

10 2

15 2

10 2

5 3

      属于第某类菜的,例如:总共有5样属于第1类的菜,而第1类中最多吃3份,那么我只能挑其中的3样脂肪最多的,其他的全部丢掉。

      用贪心,大多需要排序,因为答案要的是脂肪最多的,所以按照脂肪大小从大到小排序。

#include<bits/stdc++.h>
using namespace std;
int n,m,k,b[99999],ans=0;
struct app{
int a,b;
}a[99999];
bool low(app a,app b){
return a.a>b.a;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);int p=m;
for(int i=1;i<=k;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].a,&a[i].b);
sort(a+1,a+1+n,low);
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
if(m==0){
printf("%d",ans);return 0;
}
else if(j==a[i].b&&b[j]>0)
ans+=a[i].a,m--,b[j]--;
}

求赞