一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果。有蓝色和红色两种。他知道每颗红色糖果重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 > log(c) 则糖果r的数量不大于log(c)
Wr < loc(c) 时 :
选取重量相等的两堆糖果 Wr * Wb, 此时重量小于C;
假定 收益 Wr * Hb > Wb * Hr
故可以推知 性价比小的糖果r的数量不会大于log(c);
Code:
#include <queue>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int M = 1e5 + 233;
const int Mod = 1e9 + 7;
typedef long long ll;
int main()
{
ll wr,wb,hr,hb,c;
scanf("%lld%lld%lld%lld%lld",&c,&hr,&hb,&wr,&wb);
ll ans = 0, sqr = sqrt(c);
if(wr < wb)//思维题。。。。。
{
swap(hr,hb);
swap(wr,wb);
}
if(wr >= sqr)
{
for(int i=0;i<=c/wr;i++)
{
int j = ( c - i * wr) / wb;
ans = max(ans, (ll)hr*i + hb*j);
}
}
else{
if(wr*hb > wb*hr) swap(wr,wb),swap(hr,hb);
for(int i=0;i<=sqr+1;i++)
{
int j = ( c - i * wb) / wr;
ans = max(ans, (ll)hb*i + hr*j);
}
}
printf("%lld\n",ans);
}