[CF0526C] Om Nom and Candies 解题记录

[CF0526C] Om Nom and Candies 解题记录


题意简述

有红色和蓝色两种糖果,每颗红糖重 W r W_r Wr 克,每颗蓝糖重 W B W_B WB 克。吃一颗红糖可以获得  H r H_r Hr​ 的快乐值,吃一颗蓝糖可以获得  H b H_b Hb​ 的快乐值。
问在最多吃 C C C 克糖果的情况下能获得的快乐值。


题目分析

题解区的大佬都是用什么根号分治和剩余系来做的,像我这种蒟蒻根本看不懂,所以我就想到了一个暴力的做法。
其实我们可以直接枚举选几颗红糖,剩下的重量全选蓝糖(枚举蓝糖同理),每次更新最大快乐值就可以了,最多枚举 C \sqrt C C 次。
可以设吃 i i i 红糖, j j j 蓝糖。因为我们是通过枚举的方式来找到最优解,而最优解一定在解空间的边界上取得。所以,我们只需要在边界上进行枚举即可找到最优解。考虑到解空间大小为 i max × j max i_{\text{max}} \times j_{\text{max}} imax×jmax,那么当 i max × j max ≤ C i_{\text{max}} \times j_{\text{max}} \leq C imax×jmaxC 时,我们只需要循环 C \sqrt C C 次,就可以覆盖到整个解空间边界,从而找到最优解。


AC Code
#include<bits/stdc++.h>
#define arrout(a,n) rep(i,1,n)std::cout<<a[i]<<" "
#define arrin(a,n) rep(i,1,n)std::cin>>a[i]
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dep(i,x,n) for(int i=x;i>=n;i--)
#define erg(i,x) for(int i=head[x];i;i=e[i].nex)
#define dbg(x) std::cout<<#x<<":"<<x<<" "
#define mem(a,x) memset(a,x,sizeof a)
#define all(x) x.begin(),x.end()
#define arrall(a,n) a+1,a+1+n
#define PII std::pair<int,int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
CI N=1e9+5;
int C,Wr,Wb,Hr,Hb,ans;
signed main() {
    std::cin>>C>>Hr>>Hb>>Wr>>Wb;
    rep(i,0,std::sqrt(N)) {
        if(Wr*i<C) {
            ans=std::max(ans,i*Hr+(C-i*Wr)/Wb*Hb);
        }
        if(Wb*i<C) {
            ans=std::max(ans,i*Hb+(C-i*Wb)/Wr*Hr);
        }
    }
    std::cout<<ans;
    return 0;
}
  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值