题目:游游有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;
}
}
}