排队过河(Queue up across the river)

自己仔细看题,理解题,这里只说解题过程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

问:当给出河中间的石墩数和荷叶数,计算最多有多少只青蛙可过河?
注意点:

  1. 青蛙到达D石墩就不可返回
  2. 青蛙只可以在石墩上面叠加(一个叠一个),荷叶上面只可以落一只青蛙
  3. 青蛙可以直接从A跳到D

从A石墩跳到D石墩只需要两步:1.先聚集在河中央的石墩和荷叶上。2.在跳到D石墩上。
给出图解:
在这里插入图片描述

如图,圆形为石墩,六边形为荷叶,绿色三角为青蛙,数字越大青蛙背的面积越大(就是数字小的青蛙可以跳到数字大的青蛙背上)。有2片荷叶,两个石墩,1,2,3号青蛙平铺满荷叶和石墩,然后叠加在一个石墩上,4,5,6号青蛙平铺剩余的1个石墩和2片荷叶,然后叠加在另一个石墩上。再将1、2、3号青蛙平铺在剩余的1个石墩和2片荷叶上,叠在4的上面,另一个石墩还可叠三个青蛙,加上两片荷叶上的和最后跳到D石墩上的总共12只。下一步,这些青蛙从A跳到河中央的逆序跳到D石墩上即可。

下面再给出3片荷叶和3个石墩的图自己理解:
在这里插入图片描述
如图,荷叶数m = 3 ,石墩n=3。m+1为一组。先将前三组分布在三个石墩上面。
在这里插入图片描述
再将这三组叠在同一个石墩上面,在下放两组
在这里插入图片描述
再一步步按组操作如图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个石墩上面就完成了。想想第二个石墩如何按组操作,可以结合代码理解。

其他情况类似。

值得注意的是,我这个是按组操作,其实如果按每个操作的话,应当有更优解。想要证明题给的答案是错的吗?比如,n=2,m=2时可通过青蛙可以是13个,感兴趣的话可以尝试一下哟!

可以给个提示:第一个石墩上面可以放7个青蛙。

代码缺少注释,重点是前面的解题过程看懂即可。
具体代码:

while True:
  sum = 0               #最终可过河数量
  n,m = map(int,input().split(','))   #m片荷叶,n个石墩
  if n < 0 or m < 0:
    break
  num1 = n
  while num1 > 0:
    num = num1
    #循环计算完成一个石墩上面的数量
    while num > 1:		#注意大于1
      sum = sum + num * (1 + m)
      num -= 1	
    num1 -= 1
  if n:
    sum += m + 1
  sum = sum + m + 1         #m个荷叶可以落m只青蛙,在加上D石墩上落的一只。
  print(sum)

猜你喜欢

转载自blog.csdn.net/weixin_44223946/article/details/109404011