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
",ans);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/alan-W/p/9016547.html