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 中。
    • 对列表 output_list 进行排序。
    • 返回 output_list 作为集合。
  • 现在执行以下步骤:
  • 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
    • 如果 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]

更新于:2021年5月18日

304 次查看

开启您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.