1548 欧姆诺姆和糖果
一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果。有蓝色和红色两种。他知道每颗红色糖果重Wr克,每颗蓝色糖果重Wb克。吃一颗蓝色糖果会给他带来Hb的欢乐值,吃一颗红色糖果会给他带来Hr的欢乐值。
欧姆诺姆最多只能吃C克的糖果,而且每一颗糖果不能只吃一半。现在他想通过吃蓝色和红色的糖果来获得最大的欢乐值。
样例解释:每一种糖果吃两颗即可。
Input
单组测试数据。 输入占一行有四个整数C,Hr,Hb,Wr,Wb (1≤C,Hr,Hb,Wr,Wb≤10^9).
Output
输出最大可能获得的欢乐值。
Input示例
样例输入1 10 3 5 2 3
Output示例
样例输出1 16
假设 wr > wb
若wr > sqrt(c),那么红色糖果最多可取 c/wr颗,c/wr < 0,枚举取红色糖果的数目即可
若wr < sqrt(c):
假设hr/wr > hb/wb,那么hr*wb > hb*wr,也就是说若吃wr颗蓝色糖果,不如吃wb颗红色糖果,所以吃的蓝色糖果数量不应超过wr颗,否则一定可以被吃wb颗红色糖果所替代
枚举,吃蓝色糖果的数量即可,最多吃wr颗,且wr<sqrt(c)
#include<stdio.h> #include<math.h> #include<string.h> #include<iostream> #include<algorithm> #define MAXSIZE 100005 #define LL long long #define INF 0x3f3f3f3f using namespace std; int main() { LL c,hr,hb,wr,wb,lr,lb,ans=0; scanf("%lld%lld%lld%lld%lld",&c,&hr,&hb,&wr,&wb); if(wr < wb) { swap(wr,wb); swap(hr,hb); } if(wr >= sqrt(c)) { for(int i=0;i*wr<=c;i++) { ans = max(ans,i*hr + (c-i*wr)/wb*hb); } } else { if((1.0*hr)/(1.0*wr) <= (1.0*hb)/(1.0*wb)) { swap(wr,wb); swap(hr,hb); } for(int i=0;i<wr;i++) { if(i*wb > c) break; ans = max(ans,i*hb + (c-i*wb)/wr*hr); } } printf("%lld\n",ans); return 0; }