问题解析
小M希望带走尽可能多的巧克力板,每个巧克力板的重量是由其边长的平方决定的。同时,她有多个背包,每个背包有不同的最大承重限制,目标是为每个背包计算最多可以带走多少块巧克力板。
输入数据
- 每块巧克力板的边长是给定的,重量是边长的平方。
- 给定多个背包,每个背包的最大承重也是给定的。
输出数据
- 对于每个背包的最大承重,输出可以带走的巧克力板数目。
思路
- 巧克力板的重量计算:每块巧克力板的重量等于边长的平方。我们需要计算每块巧克力板的重量并保存在一个列表中。
- 背包的处理:对于每个背包的承重限制,计算最多可以装入多少块巧克力板。每个背包可以装入的巧克力板数目,取决于巧克力板的重量和背包的承重限制。
- 策略:
- 首先,我们可以按重量从小到大排序巧克力板。这样可以方便地进行贪心选择,从最轻的开始放入背包,直到背包满。
- 然后,对于每个背包,检查哪些巧克力板能装入,并计算能装入的数量。
方案实现
- 计算每块巧克力的重量(边长的平方)。
- 按重量升序排列巧克力板。
- 对每个背包,尝试将巧克力板从轻到重依次装入,直到背包满为止。
代码实现
def solution(n: int, m: int, a: list, queries: list) -> list:
# 计算每块巧克力板的重量(即边长的平方)
weights = [x * x for x in a]
# 对巧克力板的重量进行排序
weights.sort()
# 用于存储每个背包的结果
results = []
# 对每个背包的最大承重进行处理
for query in queries:
total_weight = 0
count = 0
# 尝试从最轻的巧克力板开始装
for weight in weights:
if total_weight + weight <= query:
total_weight += weight
count += 1
else:
break
results.append(count)
return results
if __name__ == '__main__':
print(solution(5, 5, [1, 2, 2, 4, 5], [1, 3, 7, 9, 15]) == [1, 1, 2, 3, 3])
print(solution(4, 3, [3, 1, 2, 5], [5, 10, 20]) == [2, 2, 3])
print(solution(6, 4, [1, 3, 2, 2, 4, 6], [8, 12, 18, 25]) == [2, 3, 4, 4])
解释
-
计算每块巧克力的重量:
每块巧克力板的重量等于它的边长的平方,例如对于边长为1的巧克力板,重量是1²=1;对于边长为2的巧克力板,重量是2²=4。 -
排序巧克力板的重量:
为了方便计算最多能装多少块巧克力板,我们先按巧克力的重量升序排序。这样可以通过贪心算法,从最轻的巧克力开始依次放入背包,直到背包的承重超出为止。 -
贪心算法:
对于每个背包,我们检查从最轻的巧克力开始,逐个尝试放入背包,并记录装入的数量。直到当前的巧克力放入后超出背包的最大承重为止。 -
返回结果:
对于每个背包的查询,返回装入巧克力板的数量。
时间复杂度
- 计算重量:每块巧克力板的重量计算是O(n),其中n是巧克力板的数量。
- 排序巧克力板的重量:排序的时间复杂度是O(n log n)。
- 处理每个背包:对于每个背包查询,我们最多遍历所有的巧克力板,处理的时间复杂度是O(n)。
- 总的时间复杂度:O(n log n + m * n),其中n是巧克力板的数量,m是背包的数量。
示例分析
示例1:
输入:
n = 5, m = 5, a = [1, 2, 2, 4, 5], queries = [1, 3, 7, 9, 15]
- 计算每块巧克力板的重量:[1, 4, 4, 16, 25]
- 排序后的重量:[1, 4, 4, 16, 25]
- 处理每个背包查询:
- 背包承重1,最多能装1块巧克力。
- 背包承重3,最多能装1块巧克力。
- 背包承重7,最多能装2块巧克力。
- 背包承重9,最多能装3块巧克力。
- 背包承重15,最多能装3块巧克力。
输出:
[1, 1, 2, 3, 3]
示例2:
输入:
n = 4, m = 3, a = [3, 1, 2, 5], queries = [5, 10, 20]
- 计算每块巧克力板的重量:[9, 1, 4, 25]
- 排序后的重量:[1, 4, 9, 25]
- 处理每个背包查询:
- 背包承重5,最多能装2块巧克力。
- 背包承重10,最多能装2块巧克力。
- 背包承重20,最多能装3块巧克力。
输出:
[2, 2, 3]
示例3:
输入:
n = 6, m = 4, a = [1, 3, 2, 2, 4, 6], queries = [8, 12, 18, 25]
- 计算每块巧克力板的重量:[1, 9, 4, 4, 16, 36]
- 排序后的重量:[1, 4, 4, 9, 16, 36]
- 处理每个背包查询:
- 背包承重8,最多能装2块巧克力。
- 背包承重12,最多能装3块巧克力。
- 背包承重18,最多能装4块巧克力。
- 背包承重25,最多能装4块巧克力。
输出:
[2, 3, 4, 4]
1. ```