zoukankan      html  css  js  c++  java
  • 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

    基本方法:
    一、枚举r糖果和b糖果
    二、枚举一个就可以确定另一个,所以枚举r糖果或b糖果
    显然这两种都会超时

    数据范围<=10^9,显然要用 根号或log级别的算法
    假设wr<wb
    若wb>=根号c,那么wb 最多只能取 根号c 个
    这就把 wb>根号c 的枚举优化到了 根号 级
    若wb<根号c
    假设 hr/wr < hb/wb
    可化为 hr*wb < wr*hb
    不妨设 r糖果wb个,那么占据 wb*wr 的空间,得到 wb*hr
    那么在wb*wr的空间里,就可以放 wr个b糖果,得到 wr*hb
    因为 hr*wb < wr*hb
    所以 若r糖果吃 wb个,那么b糖果吃 wr个更优
    所以 r糖果 吃的个数不超过 wb个,可以枚举 r糖果
    因为 没吃wb个r糖果,都可以转为 吃 wr个b糖果替代

    这样我们就优化到了根号n

    这种优化并没有涉及其他的算法,
    在原来枚举方法的基础上,找制约关系减少枚举

    枚举 r和b 到 枚举 r或b ,
    因为r和b两者 占据的总空间固定
    再到根号n枚举,
    因为 通过 两者 自带的属性找到了制约关系
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #define ll long long
    using namespace std;
    ll c,hr,hb,wr,wb,ans;
    int main()
    {
        cin>>c>>hr>>hb>>wr>>wb;
        if(wr>wb) 
        {
            swap(wr,wb);
            swap(hr,hb);
        }
        if(wb>=sqrt(c)) 
        {
            for(int i=0;i*wb<=c;i++)
            ans=max(ans,i*hb+(c-wb*i)/wr*hr);
        }
        else
        {
            if(1.0*hr/wr>1.0*hb/wb)
            {
                swap(wr,wb);
                swap(hr,hb);
            }
            for(int i=0;i<wb;i++)
            {
                if(i*wr>c) break;
                ans=max(ans,i*hr+(c-i*wr)/wb*hb);
            }
          
        }
        cout<<ans;
    }

    注意在枚举r糖果时,不能超过总容量

    转载于:https://www.cnblogs.com/TheRoadToTheGold/p/6746768.html

  • 相关阅读:
    软件质量
    LINUX
    C# .net 多线程中集合数据同步
    一些常用COM接口表
    PHP、JAVA、C#、Object-C 通用的DES加密
    【C#公共帮助类】给大家分享一些加密算法 (DES、HashCode、RSA、AES等)
    C#中如何把int转换成两个字符的string 缺位补零
    C#中Math.Round()实现中国式四舍五入
    C# RGB与16进制颜色转换方法
    c# e语言 字节集 表示方式
  • 原文地址:https://www.cnblogs.com/twodog/p/12140793.html
Copyright © 2011-2022 走看看