题意
有两种糖果,给出每种糖果的重量 wr,wbw_r,w_bwr,wb 和吃掉一颗获得的快乐值 hr,hbh_r,h_bhr,hb。
你最多可以吃 ccc 重量的糖果,求最大可获得的快乐值。
分析
看前面很多 dalao 都用了一些很强的算法,我只能来水一发 O(n)O(\sqrt n)O(n) 的暴力。
考虑枚举每种糖果吃掉的数量,但是时间复杂度最大可到 10910^9109,明显过不了。
我们发现,若吃红糖 iii 颗,那么可吃蓝糖 (c−i×wr)÷wb(c-i\times w_r)\div w_b(c−i×wr)÷wb 颗,反之亦然。
所以只要在枚举时考虑两种情况,可以在枚举 1∼n1\sim\sqrt n1∼n 时同时计算 n∼n\sqrt n\sim nn∼n 的值。
所以就直接打一个循环暴力水过,时间复杂度 O(n)O(\sqrt n)O(n)。
Code
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline ll read(){ll x=0,f=1;char c=getchar();while(c<48||c>57){if(c==45)f=0;c=getchar();}while(c>47&&c<58)x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;}
ll c,hr,hb,wr,wb,ans;
signed main(){
c=read(),hr=read(),hb=read(),wr=read(),wb=read();
for(ll i=0;i<=sqrt(c);++i){
if(i*wr<c){
ans=max(ans,i*hr+(c-i*wr)/wb*hb);
}
if(i*wb<c){
ans=max(ans,i*hb+(c-i*wb)/wr*hr);
}
}
printf("%lld",ans);
}
文章描述了一道关于吃糖果的问题,通过观察发现可以通过枚举每种糖果吃掉的数量,利用两种糖果之间的关系优化算法,将时间复杂度从O(10^9)降低到O(sqrt(n)),实现暴力求解最大快乐值。

1359

被折叠的 条评论
为什么被折叠?



