营养膳食-模拟
作者:互联网
(过水已隐藏的蒟蒻?
当成动态规划做
想转移方程想好久
一通瞎搞
搞到崩溃
突然(咳咳想到要排个序
就糊弄出来了?
(我该开心嘛?
--------------------------------------------------------------------------------------------
题目描述
阿月正在女朋友宁宁的监督下完成自己的增肥计划。
为了增肥,阿月希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。阿月通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过 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。
输出
输出一个数字即阿月可以吃到的最大脂肪指数和。
样例输入
6 6 3
3 3 2
15 1
15 2
10 2
15 2
10 2
5 3
样例输出
60
--------------------------------------------------------------------------------------------
贪心:
吃这m份食品的时候
尽量先吃脂肪最高的
只要这类食物没吃过上限就好
所以简简单单的给这些食品按脂肪量快排一下就好
(蒟蒻的我还是不想用重载运算符
傻fufu的写着cmp
#include<cstdio> #include<algorithm> using namespace std; int n,m,k,mm; int v[105],v1[105];//一次可以吃1到k类食品的最大份数 struct diet { int a,b; } q[205]; int f[105]; bool cmp(diet x,diet y) { return x.a > y.a; } int main() { // freopen("diet.in","r",stdin); // freopen("diet.out","w",stdout); scanf("%d%d%d",&n,&m,&k); for(int i = 1; i <= k; i++) { scanf("%d",&v[i]); } for(int i = 1; i <= n; i++) { scanf("%d%d",&q[i].a,&q[i].b); } sort(q+1,q+1+n,cmp); for(int i = 1; i <= n; i++) { if(mm + 1 <= m && v1[q[i].b] + 1 <= v[q[i].b]) { if(f[i - 1] + q[i].a > f[i]) f[i] = f[i - 1] + q[i].a,v1[q[i].b]++,mm++; } else f[i] = f[i - 1]; } printf("%d",f[n]); return 0; }
标签:膳食,int,diet,食品,营养,阿月,100,脂肪,模拟 来源: https://www.cnblogs.com/darlingroot/p/10890422.html