游游的水果大礼包O(1)时间复杂度算法

题目:游游有n个苹果,m个桃子。她可以把2个苹果和1个桃子组成价值a元的导水果大礼包,也可以把1个苹果和2个桃子组成价值b元的二号水果大礼包。游游想知道,自己最多能组成多少价值总和的大礼包?

#include <iostream>
typedef long long ll;
using namespace std;

int main() 
{
    ll n,m,a,b;
    cin>>n>>m>>a>>b;
    ll maxfruit =a>b?n:m;
    ll minfruit =a>b?m:n;
    ll maxmoney=max(a,b);
    ll minmoney =min(a,b);//根据大礼包的价格将两种水果分开
    if(maxmoney>=2*minmoney)
    {
        ll value =0;
        if(maxfruit%2==1&&minfruit-maxfruit/2>=2)
        value=minmoney;
        if(minfruit>=maxfruit/2)
        cout<<(maxfruit/2)*maxmoney+value;
        else
         cout<<minfruit*maxmoney;
        return 0;
    }//优选贵的大礼包,因为两倍的便宜的大礼包更费水果还便宜
    else 
    {
        if(minfruit>=2*maxfruit)
        {
            cout<<maxfruit*minmoney;
            return 0;
        }
        else if(maxfruit>=2*minfruit)
        {
            cout<<minfruit*maxmoney;
            return 0;
        }//稀缺数量资源最大利用化
        else
        {
            ll value=0;
        value+=maxfruit/2*maxmoney;
        maxfruit%=2;
        minfruit-=maxfruit/2;
            if(maxfruit==1&&minfruit==1)//minfruit不会小于1的
            {
                cout<<value;
                return 0;
            }
            if(maxfruit==1)
            {
                minfruit-=2;
                value+=maxmoney;
            }
            value+=(2*minmoney-maxmoney)*minfruit/3;//补差价
            cout<<value;
            return 0;

        }
    }
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值