自己仔细看题,理解题,这里只说解题过程
问:当给出河中间的石墩数和荷叶数,计算最多有多少只青蛙可过河?
注意点:
- 青蛙到达D石墩就不可返回
- 青蛙只可以在石墩上面叠加(一个叠一个),荷叶上面只可以落一只青蛙
- 青蛙可以直接从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)