Python程序:计算可容纳所有朋友的巴士大小
假设有n个学生组在等待乘坐学院校车回家。每个学生组有m个学生。学生组希望一起乘坐校车,不分开。他们只有在他们小组的所有成员都能上车的情况下才上车。此外,如果他们之前的小组尚未上车或已到达目的地,则该小组不上车。如果我们已知小组的数量和每个小组的学生数量,我们需要找出校车的大小,以便校车能够运送所有小组,并且每次校车从学院出发时都没有空位。
所以,如果输入类似于组数 gr_no = [3, 4, 2, 2, 1, 4, 3, 5],则输出将是 [12, 24]。
如果校车大小为12,它可以在第一次行程中容纳1-5组,在第二次行程中容纳其余小组。
如果校车大小为24,它可以容纳所有小组并在一次行程中运送它们。
为了解决这个问题,我们将遵循以下步骤:
- 定义一个函数 factor_ret()。它将接收n。
- 对于 i in range (0 到 n ^ 0.5),执行:
- 如果 n mod i 等于 0,则:
- 将一个元组 (i, floor(n/i)) 添加到 output_list 中。
- 如果 n mod i 等于 0,则:
- 对列表 output_list 进行排序。
- 返回 output_list 作为集合。
- 对于 i in range (0 到 n ^ 0.5),执行:
- 现在执行以下步骤:
- total := 一个包含项目 gr_no[0] 的新列表。
- 对于 i in range 1 到 gr_no 的大小,执行:
- 在 total 的末尾插入 total[i - 1] + gr_no[i]。
- b_sizes := 一个新列表。
- 对于 factor_ret(gr_no 列表的总和) 中的每个大小,执行:
- temp_list := 从 total 中所有非零元素生成的新列表。
- index := 1
- indicator := True
- 对于 temp_list 中的每个点,执行:
- 如果点不等于 size * index,则:
- indicator := False
- 跳出循环。
- index := index + 1
- 如果点不等于 size * index,则:
- 如果 indicator 为 True,则:
- 在 b_sizes 的末尾插入 size。
- 返回 b_sizes。
示例
让我们看看下面的实现以更好地理解:
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]
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP