51nod -1548

题目来源:  CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 20  难度:3级算法题
 收藏
 关注

一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果。有蓝色和红色两种。他知道每颗红色糖果重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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值