一道递归方面的题目

victor1970 2009-05-24 06:28:46
现在只有红,黄,蓝三种颜色的气球。规则为两个不同颜色的气球可以换成同等数量的第三种颜色的气球。例如:1红+1黄=2蓝,交换的次数没有限制,现在知道你所拥有的每种颜色气球的数量,问是否能通过交换达到拥有一种颜色气球的状态?

输入数据有多个case,每个case输入为一行,依次为你拥有的红色,黄色,蓝色气球的数量(气球很贵,每种数量不会超过10^5)。

如果通过上述规则可以将气球换成一种颜色的气球,输出”Yes”,并且空格后给出转化后你拥有的气球的颜色编号(红:1 黄:2 蓝:3)如果有多种转化结果,输出编号小的那个,否则输出”No”。

...全文
168 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangxfeng112 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhangxfeng112 的回复:]
定理:假设有3种气球数量分别为:
红 r
黄 y
蓝 b

他们三个取差值, x = |r - y| //x 等于r - y的绝对值,
y = |r - b|
z = |y - b|
若 x能被3整除(即x是3的倍数),且r, y和 b中至少有2个不为零,那么可以通过转换把所有的球都变成 蓝色。
若 y能被3整除(即y是3的倍数),且r, y和 b中至少有2个不为零,那么可以通过转换把所有的球都变成 黄色。
若 z能被3整除(即z是3的倍数…
[/Quote]

都不能被3整除,则不存在一种转换把他们变成同一种颜色。
deerwin1986 2009-05-25
  • 打赏
  • 举报
回复
1首先考虑最简单的情况:
只有一种颜色。。。 直接返回YES
2然后是只有两种颜色:
如果两者数量相等当然直接YES
如果不等 设多的是big 少的是small 则他们可以换为另外一种颜色 只要能换出另一种颜色的数目和换后的small相等 就可以把它们换成big了 就YES 否则不行
即 small - n = 2n 是否有正整数解的问题
3最后是三种颜色:
由上面可以得到问题大概思路 为了优先返回编号小的 可以优先把编号小的颜色数量换成多的 不行的话再依次向编号大的试 然后设多的为high 中等的为mid 少
的为low 则和上面的分析类似 是解 mid - n = low + 2n 即 mid - low = 3n 是否有整数解的问题...
diablox0147 2009-05-25
  • 打赏
  • 举报
回复
是我没看懂题目还是怎么得...怎么看起来很简单的题目阿...

如果想全转成红色的话就看下黄和蓝是不是平等的..如果不是的话就看看黄和蓝色多出来的能不能利用红色转成平等。
如果
红 黄 蓝
10 4 10

那就把蓝色多出来的6和红色转2此变成:
红 黄 蓝
8 8 8

就可以全部转成红色的了..如果没办法转成平等的话答案就是NO
adventurelw 2009-05-25
  • 打赏
  • 举报
回复
我考虑得比较简单,不知道是不是有什么遗漏的
假设a, b, c为三种气球的数目
同时假设最终可以全部都变成a
那么必然b,c可以通过一些转换变得相等,而转换有两个途径(本来是有三个,只是b+c=2a对改变bc的差值没有意义):a+b=2c;a+c=2b
不管哪种方法,b,c中增加的那一个的增加量都是另一个的减少量的2倍
b + 2i = c - i
的必要条件b-c必须是3的倍数。

再来看a,b,c的相对大小对转换的限制
很明显,两个数量较少的颜色可以转换成数量最多的那个颜色,因为需要把较少数量的两个颜色转换成一样,所需要的次数(即
需要从颜色最多中拿来转换的数目)是差值的1/3
要把最少和最多的转成中间数量的话,那么根据上面,需要两个条件:当max() - min()的值为3的倍数时,必须能够经过i次转换,达到以下
目的:mid() + 2i >= (max() - min()) / 3 && min() - i >= 0.(max()为最大值,其余类推)
把mid()和max()转换成min(),类似的分析:max() - mid() % 3 == 0;
min() + 2i >= (max() - mid()) / 3 && mid() - i >= 0

太晚了,也不知道上边的分析是否符合题意,请达人指正。
shex4 2009-05-25
  • 打赏
  • 举报
回复
红 黄 蓝 :( r , y , b )

每次找出非零元素中最小的两个,将其中个数较小全部换掉。例如(1,3,5)=>1r + 1y = 2b => (0,2,7)
然后2y+2b=2r => (4,0,5) 然后 4r+4b=8y => (0,8,1)=>无解?

wesweeky 2009-05-25
  • 打赏
  • 举报
回复
坐板凳 听课
zhangxfeng112 2009-05-25
  • 打赏
  • 举报
回复
定理:假设有3种气球数量分别为:
红 r
黄 y
蓝 b

他们三个取差值, x = |r - y| //x 等于r - y的绝对值,
y = |r - b|
z = |y - b|
若 x能被3整除(即x是3的倍数),且r, y和 b中至少有2个不为零,那么可以通过转换把所有的球都变成 蓝色。
若 y能被3整除(即y是3的倍数),且r, y和 b中至少有2个不为零,那么可以通过转换把所有的球都变成 黄色。
若 z能被3整除(即z是3的倍数),且r, y和 b中至少有2个不为零,那么可以通过转换把所有的球都变成 红色。
绿色夹克衫 2009-05-25
  • 打赏
  • 举报
回复
似乎用不到递归呀,可以连立一个有3个变量的线性方程组,3个变量分别是r + y = 2b的个数,r + b = 2y的个数,
b + y = 2r的个数,如果方程的解都是整数,就有解,否则无解。
kingstarer 2009-05-24
  • 打赏
  • 举报
回复
由于三个不同颜色的汽球可以转成任意一种颜色的汽球,所以状态数可以减到
10^10
kingstarer 2009-05-24
  • 打赏
  • 举报
回复
穷举搜索吧

状态数只有10*15个
lpf000 2009-05-24
  • 打赏
  • 举报
回复
guanzhu
shex4 2009-05-24
  • 打赏
  • 举报
回复
关注
liliangbao 2009-05-24
  • 打赏
  • 举报
回复
帮顶!!!
十八道胡同 2009-05-24
  • 打赏
  • 举报
回复
很难的说
十八道胡同 2009-05-24
  • 打赏
  • 举报
回复
ACM题?

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧