硬币 贪心算法 java_JZOJ.1153【贪心算法】硬币交换

好难啊!!!

可聪明的我还是解出来了!(逃

题目描述

小z最近迷上了一款游戏――To Be A Farmer,他在游戏中控制的人物是一个叫FZ的Farmer。FZ身上有G1个金币、S1个银币和B1个铜币,而他至少需要G2个金币、S2个银币和B2个铜币。为了完成这个目标,小z只好控制FZ来到了游戏中的银行。银行有如下规定:

(1)你可以用1个金币交换9个银币;

(2)你可以用11个银币交换1个金币;

(3)你可以用1个银币交换9个铜币;

(4)你可以用11个铜币交换1个银币;

小z看到这些规定,顿时头大了,只好求助于你。聪明的你来帮助他解决这样一个问题:最少需要交换多少次硬币才能至少拥有G2个金币、S2个银币和B2个银币呢?

输入

第1行包含三个整数:G1、S1和B1。

第2行包含三个整数:G2、S2和B2。

0 ≤ G1、S1、B1、G2、S2、B2 ≤ 10000000。

输出

如果可以完成任务的话,输出一个整数表示最少交换次数;否则输出整数-1。

样例输入

10 0 0

0 0 81

样例输出

10

初步思路:

判断可不可以刚好用完。

如果不,则将现有金钱通过兑换减少。(1个金币,2次交换 金->银->金,减为原来的9/11)

重复1,2,直到刚好换到所需的钱。

码完代码,提交到OJ,真是:

TLE里说今年,听取WA~声一片!

介才系建切希露:

将银币换为所需金币和铜币。

判断已有银币和所需银币的大小。

若所需银币大于已有银币,则是Impossible。

反之则模拟 暴力 次数。

代码在这儿(说得这么明白,都不想放了)

#include

using namespace std;

int a1,b1,c1,a2,b2,c2,ans;

int main()

{

cin>>a1>>b1>>c1>>a2>>b2>>c2;

if(a1 < a2)

{

ans+=a2-a1;

b1-=(a2-a1)*11;

a1=a2;

}

if(c1 < c2)

{

ans+=(c2-c1+8)/9;

b1-=(c2-c1+8)/9;

c2+=(c2-c1+8)/9*9;

}

if(b1 < b2 && a1 > a2)

{

if(b1+(a1-a2)*9 < b2)

{

ans+=(a1-a2);

b1+=(a1-a2)*9;

a1=a2;

}

else

{

ans+=(b2-b1+8)/9;

a1-=(b2-b1+8)/9;

b1+=(b2-b1+8)/9*9;

}

}

if(b1 < b2)

{

if(b1+(c1-c2)/11 >= b2)

{

ans+=(c1-c2)/11;

b1+=(c1-c2)/11;

c1-=(c1-c2)/11*11;

}

}

b1 >= b2 ? cout<

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值