251道题目解析 | 豆包MarsCode AI刷题

99 阅读4分钟

问题描述

小M在春游时打算携带尽可能多的巧克力板。她拥有n块巧克力板,每块巧克力的边长为aia**i,重量为ai2a**i2。小M有多个不同大小的背包,每个背包都有一定的最大承重限制。她希望你帮助她计算在每个背包的最大承重范围内,最多可以带走多少块巧克力板。

例如:小M有5块巧克力板,边长分别为1, 2, 2, 4, 5,有5个不同的背包,其最大承重分别为1, 3, 7, 9, 15。对于每个背包,她能装入的巧克力块数分别是1, 1, 2, 3, 3

代码

 def solution(n: int, m: int, a: list, queries: list) -> list:
     weights = [x**2 for x in a]
     weights.sort()
     results = []
     for max_weight in queries:
         current_weight = 0
         count = 0
         for weight in weights:
             if current_weight + weight <= max_weight:
                 current_weight += weight
                 count += 1
             else:
                 break
         results.append(count)
     return results
  1. 思路解析

    • 数据准备

      • 首先,根据题目中每块巧克力的边长(a_i),其重量为(a_i^2)。在代码中通过weights = [x**2 for x in a]这一行代码,使用列表推导式快速地计算出每块巧克力的重量并存储在weights列表中。这里使用了简洁的Python语法来实现对每个元素的平方操作。
    • 排序的目的

      • 接着weights.sort()对巧克力的重量进行排序。这是一个关键的步骤,因为按照重量排序后,我们在后续尝试往背包中装巧克力时,可以优先选择重量较轻的巧克力,这样可以尽可能多地装入巧克力。例如,如果有重量为1、4、9的巧克力,而背包承重为10,按照从小到大的顺序选择,就可以先选1,再选4,再选9,共装入3块;如果不排序,可能先选9就装不下其他的了。
    • 处理每个背包

      • 然后,通过外层的for max_weight in queries:循环来遍历每个背包的最大承重限制。对于每个背包的最大承重max_weight,我们初始化current_weight = 0(当前已装入背包的巧克力总重量)和count = 0(已装入背包的巧克力块数)。
      • 在内层的for weight in weights:循环中,我们逐个检查巧克力的重量。如果current_weight+weight <= max_weight,说明这块巧克力可以装入背包,那么我们就更新current_weight(加上这块巧克力的重量)和count(巧克力块数加1);否则,说明再装入这块巧克力就会超重,就跳出这个内层循环。
      • 最后,将每个背包能够装入的巧克力块数count添加到results列表中。循环结束后,results列表就包含了每个背包能够装入的巧克力块数,通过return results返回这个结果列表。
  2. 代码详解

    • 函数定义

      • def solution(n: int, m: int, a: list, queries: list) -> list:这行定义了一个名为solution的函数,它接受四个参数。n表示巧克力的块数,m表示背包的个数,a是一个包含巧克力边长的列表,queries是一个包含每个背包最大承重的列表,函数的返回值是一个包含每个背包最多能装入巧克力块数的列表。
    • 计算巧克力重量

      • weights = [x**2 for x in a]使用列表推导式计算巧克力的重量。这里x是从a列表中逐个取出的元素,x**2计算每个元素的平方,最终得到一个包含所有巧克力重量的新列表weights
    • 重量排序

      • weights.sort()weights列表进行排序,默认是升序排列,这样重量小的巧克力会排在前面。
    • 计算每个背包能装的巧克力数量

      • 外层

         for
        

        循环

         for max_weight in queries:
        

        遍历每个背包的最大承重。

        • 对于每个max_weight,初始化current_weight = 0count = 0

        • 内层

           for
          

          循环

           for weight in weights:
          

          遍历已排序的巧克力重量列表。

          • 如果current_weight+weight <= max_weight,则current_weight += weightcount += 1,表示可以装入这块巧克力并更新相关变量。
          • 如果不满足条件则break跳出内层循环。
        • 然后results.append(count)将每个背包能装的巧克力数量添加到results列表中。

    • 返回结果

      • 最后return results返回包含每个背包最多能装入巧克力块数的列表。