硬币翻转问题(一个比较简单的题)

在洛谷中有一道入门题,硬币翻转,虽然说不上多难,但对于很多初学者(比如我)应该是比较费时间的,那么,接下来,就由我来为大家讲解一下整体的一个思路(未优化过的)

1.首先是翻转条件,假设有n枚硬币,那我们一次,就必须翻转n-1枚,并且,要求整体全部翻转完后用的翻转次数最少,那么,我们应该怎么做呢?这就是接下来的过程了,过程我会为大家分成六个大的步骤

2.第一步,我们从后向前,翻转n-1枚。

   第二步,我们将最前面,也就是上一次没有       翻转到的那个那枚硬币,和从后向前n-2枚硬     币翻转一次

   第三步,和第二步刚好相反,这次我们将从       前向后的n-2枚硬币,和最后一枚硬币翻转一     次

   第四步,和第一步相反,我们将从前向后,       翻转n-1枚硬币

   第五步,与第二步类似,我们将最前面两个       和,从后向前n-3枚硬币翻转一次

    第六步,如果一开始硬币均为正面向上,那      我们这次,只需要将其中都是正面向上的硬      币翻转一次即可(你会发现,恰好也是n-1        枚)

3.那么,我相信,看到这里,各位肯定有些疑     惑,比如,当硬币为两枚时,我们根本不需       要第三步和后续步骤,当硬币为四时,我们       又不需要第四步之后的步骤,当硬币数量大       于六时,我们只靠这六步,似乎做不到全部       翻转,那么,这里,也就是为什么我前面说       是五个大的步骤了,硬币数量<=4的情况,     我们暂且不讨论,后续会说。当硬币数量大       于六枚时,第五步,就是关键了,细心的读       者可能发现了,这些步骤,刚刚好对应了硬       币数量,并且,硬币数量都是偶数,是的,       如果当数量为奇数时,我们每次翻转的数量       是偶数个,而偶数加偶数是不可能等于奇数       的,所以,这个问题本身,就抛去了奇数个       的情况,而最少步骤的次数,也恰好就是硬       币的个数,所以,当硬币大于六个时,第五       步就要开始一个循环,而每多两个硬币就要       多循环一次,并且,每次循环时,翻转方式       也要改变,改变方法是,每多循环一次,就       令最前面翻转的硬币数量加一,然后,最后       面翻转的硬币数量减一,以此类推,最后再       加上第六大步就可以了

那么,以上就是我们的一个整体思路了,接下来,我会为大家演示详细的代码                           (1).各变量的对应含义                                             70cf0c5e81a540899715656710ae028f.png

 (2).第一步和第一步对应的打印并换行

66aa91d1cf7e422d9f5f1d315683c27c.png

 (3).第二步与第二步对应的打印与换行

1ac2e566409b4af4ad21a07c120fdb6f.png

 (4).第三步的实现

0f465e1980234752a3b9dabbc04d948f.png

 (5).第四步的实现

82ecbebe4b7e410da0a516f5aef0db8a.png

 (6).至关重要的第五步,和它的循环

78716f7f103c4ddb8b1b79adf5650f7f.png

26b69c393c294c04baf5c4ac998cf3cb.png 

db00d4bfc600402498d255d43af7cc4a.png 

66be40e27f0e425aa95ac660d7536420.png 

 (7).最后一步的实现,也是最简单的一步了

16abd03873234e2cbfa6002cdd584a4d.png

以上就是硬币反转问题的全过程了,因为我也是第一次接触这个题,废了不少时间,中间这些思路也是自己举例一次次在纸上尝试的,然后总结出来的思路,所以,代码整体看着很啰嗦,也很笨长,也还未优化,所以,各位看的时候,还请见谅(இωஇ )(而且,我也是一位初学者,所以,代码思路,也显得比较呆,如果各位大佬有好的思路和优化方法,欢迎评论留言,请各位大佬多多指教!)

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值