字节思维题:100枚硬币,甲和乙轮流拿,每次只能拿1-5枚,最后拿完硬币的人赢,让甲先手拿,怎么拿才能保证甲最后一定赢?

1,705 阅读4分钟

image.png

题目:100枚硬币,甲和乙轮流拿,每次只能拿1-5枚,最后拿完硬币的人赢,让甲先手拿,怎么拿才能保证甲最后一定赢?

答: 甲一开始要拿4个,后续甲的操作都要建立在乙的操作之后,并保证两者拿的数目之和为6,比如说乙拿了4,那么甲就需要拿2个,这样到最后轮到乙拿的时候,一定还会剩下6枚硬币,因双方每次只能拿1-5枚硬币,所以无论乙拿多少个,甲最终都可以拿完剩下的硬币成为胜利者。

解题思路:

这个拿硬币的流程一定是如下面所示:虽然题目上规定是甲先拿,但由于我们要保证甲赢,所以最后一次一定是甲拿的。如果我们从后面往前面推的话,也可以把上一轮的乙和当前一轮的甲看成是同一轮的,如下方加黑字体

甲 乙

甲 乙

.......

甲 乙


我们通过反推的思路来解这道题,最后想让甲赢,也就是要让甲拿完最后剩下的球。那么对于乙来说,就要求最后一轮他拿不完剩下的所有球,而且无论怎么拿,剩下的球都会被甲一次性拿完。

再结合题目上的条件:双方一次性只能拿1-5球。又要符合我们上面说的这个条件,那么最后轮到乙拿的时候应该还剩6个硬币。

按照这个思路,我们可以继续推导。如果我们想让最后一轮还剩6个硬币,那上一轮我们应该剩下多少个,才能够保证最后一轮一定可以剩6个呢?

肯定是12个。为什么?因为最后剩多少个的决定权在甲那里,甲是要在乙选完之后才选的,乙选多少我们不能决定,但是我们可以决定两者的总和是多少啊。这个总和就是6,乙选1的时候,甲可以选5;乙选5的时候,甲可以选1,这个总和被甲拿捏的死死的,至于总和为其它数字嘛就不行了,大家可以自行举例推导

后续的流程和上述推导差不多:

最后一轮还剩6个球,轮到乙拿,无论乙拿多少个,甲都可以一次性拿完,比如说乙5甲1,乙1甲5....

倒数第二轮12个球,轮到乙拿,无论乙拿多少个,甲都可以将总和控制在6个,使得下一轮还剩6个

倒数第三轮还剩18个球,轮到乙拿,无论乙拿多少个,甲都可以将总和控制在6个,使得下一轮还剩12个

..........

第一轮(这里的第一轮指的是甲首次拿了球之后)还剩96个球,轮到乙拿,无论乙拿多少个,甲都可以将总和控制在6个,使得下一轮还剩90个

现在就只差第一个甲还没有拿球了,而且它拿的肯定是100 - 96 = 4个

总结:这种类型的题目中,一方的行为一定要视另一方的行为而动态变化,俗称套路,最终才能赢得比赛

规律:

  • 这种题目一般都是考虑倍数的问题,比如说这道题,甲每一次拿完之后,只需要保证剩余的球是6的倍数就可以了,因为甲可以根据乙的拿取情况将一回合的总数控制为6,这样最终拿完的一定是甲
  • 除数为(一次最多抓取的数 加上 最少抓取的数)即5+1 = 6,100 % 6 = 4,余数就为第一次抓取的数目
  • 除尽的情况下,后拿者赢;(后者每次拿的个数都是除数 - 前者拿的个数)
  • 除不尽的情况下,先拿者赢;(先拿者先拿出被除数对除数的余数,然后的每一个回合,拿出除数-前者拿出的个数)