[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×jmax≤C 时,我们只需要循环 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;
}