Python程序:查找能容纳所有朋友组的巴士大小
假设有 n 个学生组等待通过大巴车从学校返回家中。每个学生组有 m 名学生。学生组希望通过大巴车旅行,而不会被分开。他们只有当他们组的所有成员都可以上车时才会上车。此外,如果他们之前的组没有上车或已经到达他们的目的地,则该组不会上车。如果我们知道组数和每组学生数,我们必须找出巴士的大小,以便能够运输所有组,并且每次巴士从学院出发时,巴士内没有空位。
因此,如果输入为 groups 或 gr_no = [3, 4, 2, 2, 1, 4, 3, 5],则输出将为 [12, 24]。
如果巴士大小为 12,则它可以容纳第一次旅行的 1 到 5 组,其余组可以在第二次旅行中完成。
如果巴士大小为 24,则它可以容纳所有组并在单次旅行中运输它们。
为了解决这个问题,我们将按以下步骤进行操作−
- 定义一个函数 factor_ret()。这将需要 n 作为参数。
- 对于 i 在范围从 0 到 n ^ 0.5 之间,执行以下操作:
- 如果 n mod i 与 0 相同,则
- 将元组( i,n/i 的下取整)加入到 output_list 中。
- 对列表 output_list 进行排序。
- 将 output_list 作为集合返回。
- 对于 i 在范围从 0 到 n ^ 0.5 之间,执行以下操作:
- 现在执行以下步骤−
- total:包含项 gr_no[0] 的新列表。
- 对于 i 在范围从 1 到 gr_no 的大小之间,执行以下操作:
- 在总结尾处插入 total[i – 1] + gr_no[i] 。
- b_sizes:一个新的列表。
- 对于 gr_no 列表之和的每个 size,执行以下操作:
- 使用 total 从所有非零元素创建新列表。
- index:为 1。
- indicator:为 True。
- 对于 temp_list 中的每个 point,执行以下操作:
- 如果 point 不等于 size * index,则
- indicator:为 False。
- 退出循环。
- index:index + 1。
- 如果 indicator 为 True,则
- 将 size 插入到 b_sizes 的末尾。
- 返回 b_sizes。
更多Python相关文章,请阅读:Python 教程
示例
接下来是一个实现的例子,以便更好地理解−
from functools import reduce
def solve(gr_no):
total = [gr_no[0]]
for i in range(1, len(gr_no)):
total.append(total[i - 1] + gr_no[i])
b_sizes = []
for size in factor_ret(sum(gr_no)):
temp_list= list(filter(lambda x : x % size == 0, total))
index = 1
indicator = True
for point in temp_list:
if point != size * index:
indicator = False
break
index += 1
if indicator:
b_sizes.append(size)
return b_sizes
def factor_ret(n):
return sorted(set(reduce(list.__add__, ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0))))
print(solve([3, 4, 2, 2, 1, 4, 3, 5]))
输入
[3, 4, 2, 2, 1, 4, 3, 5]
输出
[12, 24]