问题描述
小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
-
思路解析
-
数据准备
- 首先,根据题目中每块巧克力的边长(a_i),其重量为(a_i^2)。在代码中通过
weights = [x**2 for x in a]这一行代码,使用列表推导式快速地计算出每块巧克力的重量并存储在weights列表中。这里使用了简洁的Python语法来实现对每个元素的平方操作。
- 首先,根据题目中每块巧克力的边长(a_i),其重量为(a_i^2)。在代码中通过
-
排序的目的
- 接着
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返回这个结果列表。
- 然后,通过外层的
-
-
代码详解
-
函数定义
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 = 0和count = 0。 -
内层
for循环
for weight in weights:遍历已排序的巧克力重量列表。
- 如果
current_weight+weight <= max_weight,则current_weight += weight和count += 1,表示可以装入这块巧克力并更新相关变量。 - 如果不满足条件则
break跳出内层循环。
- 如果
-
然后
results.append(count)将每个背包能装的巧克力数量添加到results列表中。
-
-
-
返回结果
- 最后
return results返回包含每个背包最多能装入巧克力块数的列表。
- 最后
-