硬币翻转

860ed29f8353abc2d44760e6714dcb7d.gif

关注下方公众号,分享硬核知识

作者 | 小K

出品 | 公众号:小K算法 (ID:xiaok365)

01

故事起源

有n个硬币,每个硬币可能正面或者反面朝上。

82af0772c8093b11c8d0bcebf64e8457.jpeg

如果每次翻转一个硬币,在进行一定次数的翻转后,就可以使所有的硬币都正面朝上或者反面朝上,即状态一致。

406797ea72d5d4227c0d50e96706f55d.jpeg

请问是否存在一个固定的次数k,使得初始时无论是哪种状态,都可以刚好进行k次翻转,以达到全部正面或反面朝上的状态呢?如果存在,那这个最小的k是多少?

02

分析

先从简单的场景开始分析。
如果只有1个硬币,它正面或者反面都可以,因为没有其它可对比的,所以状态都一致,不用翻转,那么最小的k就是0。

1489439241ac39296f225761d80ad6ac.jpeg

如果有2个硬币,那么初始时可能有以下3种状态:2个正面,2个反面,1正1反。

87a39076be16dc4605b24f270ae531bd.jpeg

针对以上第1、2种状态,不需要翻转,而第3种至少需要翻转1次。如果都翻转一次,前面的2种状态又会不一致,所以无法找到一个固定的翻转次数k。

如果有3个硬币,对于初始状态就一致的就不用再考虑了,最小0次。

561bac52474533fb0930486d390884ae.jpeg

主要考虑不一致的,例如有1个、2个...m个不一致。

7564316dc83e3095bcf7ce224f7cdd2f.jpeg

可以看出,如果n个硬币,其中m个正面,那必定有n-m个反面,可以认为它是m个不一致,也可以认为是n-m个不一致,这2种情况是等价的,那就考虑更小的吧,因为更简单。

3998736e8eb93493371f132633c4c9b4.jpeg

再回到上面的3个硬币的情况,只需要考虑有1个正面和有2个正面。
如果都翻转1次,可以使所有的一致,但对于初始时全部相同的情况也必须翻转1次,就一定会产生不一致,所以1次不行。

8662b27caa59a64e65e952b2c817a09e.jpeg

如果都翻转2次,则一定可以。如果1个正面,就翻转另外2个反面;如果2个正面,就直接翻转这2个正面;如果全部相同,则对任何一个翻转2次,依然不改变一致的状态。所以3个硬币的最小k就是2。

那到这里你看出规律了吗,先别往下看,思考2分钟,3,2,1...
有不一样的想法可打在下面的评论区

03

规律

到了开始总结规律、提取特征信息的时候了,不要限制你的想象,发散思维。

1.首先对于任何一个硬币,翻转奇数次一定改变状态,翻转偶数次一定不改变状态。
既然翻转偶数次不变,为啥还要翻转呢,当然是为了凑数,因为要求必须刚好都翻转k次。

2.k必须是偶数。如果初始状态一致,翻转奇数次一定会将某一个状态改变,变成不一致,所以k不可能是奇数。

f61d45095d30172bb467851be5405c6d.jpeg

3.n如果是偶数,则一定找不出来这样的k。
例如下面这种场景,只有1个反面,有n-1个正面。1和n-1都是奇数,所以无论是全部翻转成正面或是反面,都需要奇数次翻转,偶数次不可能一致,所以n为偶数时无解。

db31c43fa6d980cc045a2e8a1c9b26e2.jpeg

4.最关键的来了,对于n为奇数时一定有解,那最小的k应该是多少呢?
n为奇数,所以正面和反面肯定就是一奇一偶。

d4fdde2cc676979196fb7965ec09618d.jpeg

考虑这种极端情况,只有1个反面,n-1个正面,这时n-1为偶数。

37a66bfbc9d30eccd8dedb34b9793178.jpeg

如果最终要全部为正面,则只能一直翻转这1个反面,但翻转偶数次并不变,明显不行。所以只能最终全部为反面,那就得翻转剩下的n-1个正面,至少也得n-1次。

好了,规律找到了,接下来开始coding吧。

04

代码实现

当然这个问题的难点并不在coding,这只是推理成功之后的附属品。

if ((n & 1) == 0) printf("No Solution!\n");
    else printf("%d\n", n - 1);

05

总结

这个问题主要就是要从本质上找出规律,推理了一大堆,结果异常的简单,但这些推理却是绕不开的。其实有很多看似复杂的问题,最终的结论都是非常的简单。有个经验分享给大家,如果你发现你解决一个问题时逻辑非常的复杂,要考虑很多分支情况,这时我可以大概率的猜测,90%你的方法是不对的,因为正解永远都是非常优雅简洁的。(如果不优雅,那一定不是正解)

本文原创作者:小K,一个思维独特的写手。
文章首发平台:微信公众号【小K算法】。

如果喜欢小K的文章,请点个关注,分享给更多的人,小K将持续更新,谢谢啦!

65ac19003adf66c1fb7b76fe522a823f.gif

关注下方公众号,分享硬核知识

07de4d0e01029fa8f8718ec53f706bad.gif

关注我,涨知识

58f87ed698cb7ab547557283fd46779e.gif

原创不易,感谢分享

转发,点赞,在看

往期精彩回顾

棋盘分割

喜欢三叶草的牛

原来树状数组可以这么简单?

4f89fa16f8531f5724ec00301cc8b68d.gif

分享给更多朋友,转发,点赞,在看

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值