巧克力板选择问题 | 豆包MarsCode AI刷题

127 阅读4分钟

问题解析

小M希望带走尽可能多的巧克力板,每个巧克力板的重量是由其边长的平方决定的。同时,她有多个背包,每个背包有不同的最大承重限制,目标是为每个背包计算最多可以带走多少块巧克力板。

输入数据

  • 每块巧克力板的边长是给定的,重量是边长的平方。
  • 给定多个背包,每个背包的最大承重也是给定的。

输出数据

  • 对于每个背包的最大承重,输出可以带走的巧克力板数目。

思路

  1. 巧克力板的重量计算:每块巧克力板的重量等于边长的平方。我们需要计算每块巧克力板的重量并保存在一个列表中。
  2. 背包的处理:对于每个背包的承重限制,计算最多可以装入多少块巧克力板。每个背包可以装入的巧克力板数目,取决于巧克力板的重量和背包的承重限制。
  3. 策略
    • 首先,我们可以按重量从小到大排序巧克力板。这样可以方便地进行贪心选择,从最轻的开始放入背包,直到背包满。
    • 然后,对于每个背包,检查哪些巧克力板能装入,并计算能装入的数量。

方案实现

  1. 计算每块巧克力的重量(边长的平方)。
  2. 按重量升序排列巧克力板。
  3. 对每个背包,尝试将巧克力板从轻到重依次装入,直到背包满为止。

代码实现

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²=1;对于边长为2的巧克力板,重量是2²=4。

  2. 排序巧克力板的重量
    为了方便计算最多能装多少块巧克力板,我们先按巧克力的重量升序排序。这样可以通过贪心算法,从最轻的巧克力开始依次放入背包,直到背包的承重超出为止。

  3. 贪心算法
    对于每个背包,我们检查从最轻的巧克力开始,逐个尝试放入背包,并记录装入的数量。直到当前的巧克力放入后超出背包的最大承重为止。

  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. ```