2618 - 营养膳食
时间限制 : 1 秒
内存限制 : 128 MB
阿月正在女朋友宁宁的监督下完成自己的增肥计划。
为了增肥,阿月希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。阿月通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过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
C++解答
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<queue> using namespace std; struct pos { int num; int dist; }f[500]; int cmp(pos i,pos j) { return i.num>j.num; } int main() { int n,m,k; cin>>n>>m>>k; int maxk[k+10]; for(int i=1;i<=k;++i) { cin>>maxk[i]; } for(int i=1;i<=n;++i) { cin>>f[i].num>>f[i].dist; } sort(f+1,f+n+1,cmp); int ans=0; int sum=0; for(int i=1;i<=n;++i) { if(maxk[f[i].dist]!=0) { ans=ans+f[i].num; maxk[f[i].dist]--; sum++; } if(sum==m) { break; } } cout<<ans; return 0; }
Java解答
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int n =sc.nextInt(); int m = sc.nextInt(); int k = sc.nextInt(); int[] flag = new int[k+1]; ArrayList<ttt> al = new ArrayList<>(); for (int i = 1; i <= k; i++) { flag[i]=sc.nextInt(); } for (int i = 0; i < n; i++) { al.add(new ttt(sc.nextInt(),sc.nextInt())); } Collections.sort(al); int j = m; int i = 0; int s = 0; while(j>0&&i<n) { if(flag[al.get(i).b]>0) { j--; flag[al.get(i).b]--; s+=al.get(i).a; } i++; } System.out.println(s); } } class ttt implements Comparable<ttt>{ int a; int b; public ttt(int a, int b) { super(); this.a = a; this.b = b; } @Override public int compareTo(ttt o) { // TODO Auto-generated method stub return o.a-this.a; } }