「CF526C」 Om Nom and Candies

题意

有两种糖果,给出每种糖果的重量 w r , w b w_r,w_b wr,wb 和吃掉一颗获得的快乐值 h r , h b h_r,h_b hr,hb

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

分析

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

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

我们发现,若吃红糖 i i i 颗,那么可吃蓝糖 ( c − i × w r ) ÷ w b (c-i\times w_r)\div w_b (ci×wr)÷wb 颗,反之亦然。

所以只要在枚举时考虑两种情况,可以在枚举 1 ∼ n 1\sim\sqrt n 1n 时同时计算 n ∼ n \sqrt n\sim n n 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);
}
  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值