AI刷题251.巧克力板选择问题题目解析 | 豆包MarsCode AI刷题

63 阅读5分钟

巧克力板选择问题

问题描述

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

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

测试样例

样例1:

输入:n = 5, m = 5, a = [1, 2, 2, 4, 5], queries = [1, 3, 7, 9, 15]
输出:[1, 1, 2, 3, 3]

样例2:

输入:n = 4, m = 3, a = [3, 1, 2, 5], queries = [5, 10, 20]
输出:[2, 2, 3]

样例3:

输入:n = 6, m = 4, a = [1, 3, 2, 2, 4, 6], queries = [8, 12, 18, 25]
输出:[2, 3, 4, 4]


巧克力板选择问题解题思路

问题描述

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

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

解题思路

1. 理解问题

首先,我们需要理解问题的核心要求:在给定的背包承重限制下,计算每个背包最多可以装下多少块巧克力板。巧克力板的重量是其边长的平方。

2. 计算巧克力板的重量

我们需要计算每块巧克力板的重量。由于重量是边长的平方,我们可以直接计算出来。

3. 排序巧克力板的重量

为了在每个背包中装入尽可能多的巧克力板,我们需要从轻到重依次尝试装入巧克力板。因此,我们需要对巧克力板的重量进行排序。

4. 处理每个查询

对于每个背包的最大承重限制,我们需要依次尝试装入巧克力板。具体步骤如下:

  • 初始化一个变量来记录当前背包的剩余承重。
  • 遍历排序后的巧克力板重量列表,如果当前巧克力板的重量小于等于背包的剩余承重,则将其装入背包,并减少背包的剩余承重。
  • 如果当前巧克力板的重量大于背包的剩余承重,则停止装入巧克力板。
  • 记录装入背包的巧克力板数量。

5. 返回结果

将每个背包能装入的巧克力板数量存储在一个结果列表中,并返回该结果列表。

代码解析

1. 计算每个巧克力板的重量并排序

weights = sorted([i ** 2 for i in a])

这行代码首先计算每个巧克力板的重量(即边长的平方),然后对这些重量进行排序。排序后,重量从小到大依次排列。

2. 用于存储结果

results = []

我们用一个列表来存储每个背包能装入的巧克力板数量。

3. 对每个查询进行处理

for q in queries:
    count = 0  # 可以装下的巧克力板数
    current_weight = q  # 当前背包剩余承重

    for weight in weights:
        if weight <= current_weight:
            count += 1
            current_weight -= weight
        else:
            break

    results.append(count)

对于每个背包的最大承重限制,我们初始化一个变量count来记录当前背包能装下的巧克力板数量,以及一个变量current_weight来记录当前背包的剩余承重。

遍历排序后的巧克力板重量列表,如果当前巧克力板的重量小于等于背包的剩余承重,则将其装入背包,并更新背包的剩余承重。如果当前巧克力板的重量大于背包的剩余承重,则停止装入巧克力板。

最后,将当前背包能装下的巧克力板数量添加到结果列表中。

4. 返回结果

return results

返回存储每个背包能装下的巧克力板数量的结果列表。

总结

通过上述步骤,我们可以有效地解决巧克力板选择问题。关键在于计算巧克力板的重量、排序、以及依次尝试装入背包。这种思路既简洁又高效,确保了在每个背包的最大承重范围内,尽可能多地装入巧克力板。希望这篇文章能帮助你更好地理解和解决这类问题。

完整代码

def solution(n: int, m: int, a: list, queries: list) -> list:
    # 计算每个巧克力板的重量并排序
    weights = sorted([i ** 2 for i in a])

    # 用于存储结果
    results = []

    # 对每个查询进行处理
    for q in queries:
        count = 0  # 可以装下的巧克力板数
        current_weight = q  # 当前背包剩余承重

        for weight in weights:
            if weight <= current_weight:
                count += 1
                current_weight -= weight
            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])