洛谷——P2095 營養膳食
阿新 • • 發佈:2017-12-11
san fin etc 研究 family 做的 nta -i 希望
題目描述
Mr.L正在完成自己的增肥計劃。
為了增肥,Mr.L希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那樣的話就會導致缺少其他營養。Mr.L通過研究發現:真正的營養膳食規定某類食品不宜一次性吃超過若幹份。比如就一頓飯來說,肉類不宜吃超過1份,魚類不宜吃超過1份,蛋類不宜吃超過1份,蔬菜類不宜吃超過2份。Mr.L想要在營養膳食的情況下吃到更多的脂肪,當然Mr.L的食量也是有限的。
輸入輸出格式
輸入格式:
第一行包含三個正整數n(n≤200),m(m≤100)和k(k≤100)。表示Mr.L每頓飯最多可以吃m份食品,同時有n種食品供Mr.L選擇,而這n種食品分為k類。第二行包含k個不超過10的正整數,表示可以吃1到k類食品的最大份數。接下來n行每行包括2個正整數,分別表示該食品的脂肪指數ai和所屬的類別bi,其中ai≤100,bi≤k。
輸出格式:
包括一個數字即Mr.L可以吃到的最大脂肪指數和。
輸入輸出樣例
輸入:
6 6 3 3 3 2 15 1 15 2 10 2 15 2 10 2 5 3
輸出:
60
其實是一個大水題,難點在於怎樣理解題目,開始的時候我感覺應該是每一種菜可以隨便選,但是這種菜的選擇的個數有限,但是這樣做的會就會被樣例直接卡死。然後我就感覺是不是思路出錯了啊,結果果真是思路除了問題。
這個題假如我們有5種菜屬於第2個種類吧且第二種菜可以選3個,那麽我們只能在這五種菜中選擇3個
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 505 using namespace std; int n,m,k,x,s[N],sum,ans; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); returnx*f; } struct Node { int w,num; }node[N]; int cmp(Node a,Node b) { return a.w>b.w; } int main() { m=read(),n=read(),k=read(); for(int i=1;i<=k;i++) s[i]=read(); for(int i=1;i<=m;i++) { node[i].w=read(); node[i].num=read(); } sort(node+1,node+1+m,cmp); for(int i=1;i<=m;i++) { if(s[node[i].num]) { s[node[i].num]--; n--; ans+=node[i].w; } if(n==0) break; } printf("%d",ans); return 0; }
洛谷——P2095 營養膳食