0
点赞
收藏
分享

微信扫一扫

蓝桥杯试题算法训练之未名湖边的烦恼——Python满分解答


未名湖边的烦恼

  • ​​问题描述​​
  • ​​输入格式​​
  • ​​样例输入​​
  • ​​输出格式​​
  • ​​样例输出​​
  • ​​解题思路​​
  • ​​代码实现​​

问题描述

每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。

每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)

输入格式

两个整数,表示m和n

样例输入

3 2

输出格式

一个整数,表示队伍的排法的方案数。

样例输出

5

解题思路

求方案数这一问题使用递归来处理是非常清晰的,递归是搜索组合的一种非常直观的思路。

要避免出现体育组没有冰鞋可租的尴尬场面,就要让还鞋的人比租鞋的人多,或者人数一样,如果发现租鞋的人比还鞋的人多,这时是没有可行的排队方案的。

  • 接下来,回想一下排列组合问题,要把2个人的队伍和3个人的队伍合并,怎么排?
            这时可以把问题简化,可以先让2人队伍中的一人排到新队伍中,这时就变成了把1个人的队伍和3个人的队伍合并的问题;当然,也可以让3人队伍中的一人排到新队伍中,这时就变成了把2个人的队伍和2个人的队伍合并的问题。

用代码实现就是这样:

def count(self, m, n):
if n > m: # 租鞋的人比还鞋的人多
return 0
elif n == 0: # 没有租鞋的人
return 1
else:
return self.count(m-1, n) + self.count(m, n-1)

整理一下,得到完整代码。

代码实现

class WeimingLake(object):
# Troubles by Weiming Lake
def __init__(self):
lists = list(map(int,input().split()))
self.m, self.n = lists[0], lists[1]
self.result = self.count(self.m, self.n)
print(self.result)

def count(self, m, n):
if n > m: # 租鞋的人比还鞋的人多
return 0
elif n == 0: # 没有租鞋的人
return 1
else:
return self.count(m-1, n) + self.count(m, n-1)

weimingLake = WeimingLake()

蓝桥杯试题算法训练之未名湖边的烦恼——Python满分解答_python


举报

相关推荐

0 条评论