「CF526C」 Om Nom and Candies

题意

有两种糖果,给出每种糖果的重量 \(w_r,w_b\) 和吃掉一颗获得的快乐值 \(h_r,h_b\)

你最多可以吃 \(c\) 重量的糖果,求最大可获得的快乐值。

分析

看前面很多 dalao 都用了一些很强的算法,我只能来水一发 \(O(\sqrt n)\) 的暴力。

考虑枚举每种糖果吃掉的数量,但是时间复杂度最大可到 \(10^9\),明显过不了。

我们发现,若吃红糖 \(i\) 颗,那么可吃蓝糖 \((c-i\times w_r)\div w_b\) 颗,反之亦然。

所以只要在枚举时考虑两种情况,可以在枚举 \(1\sim\sqrt n\) 时同时计算 \(\sqrt n\sim n\) 的值。

所以就直接打一个循环暴力水过,时间复杂度 \(O(\sqrt 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);
}
posted @ 2024-03-22 15:25  run-away  阅读(55)  评论(0)    收藏  举报