最小周长巧克力板组合

83 阅读4分钟

最小周长巧克力板组合

问题描述

小S在玩一个捕获敌人的游戏,她可以使用一次全屏技能来捕获尽可能多的敌人。要使捕获成功,敌人的横坐标之间的最大差值不能超过参数A,纵坐标之间的最大差值不能超过参数B。现在给出所有敌人的坐标,计算小S一次性最多可以捕获多少个敌人。

例如,小S面对3个敌人,其坐标为 [1, 1][1, 2][1, 3],当她设置技能的参数 A 为 1,B 为 1 时,最多可以同时捕获2个敌人。


测试样例

样例1:

输入:N = 3, A = 1, B = 1, coordinates = [[1, 1], [1, 2], [1, 3]] 输出:2

样例2:

输入:N = 5, A = 2, B = 2, coordinates = [[1, 1], [3, 2], [5, 1], [4, 3], [2, 2]] 输出:3

样例3:

输入:N = 4, A = 3, B = 1, coordinates = [[1, 1], [1, 2], [1, 4], [1, 5]] 输出:2

这个问题的关键是找到多个正方形巧克力板,使得它们的总面积为给定的整数 n,并且在这些正方形巧克力板的周长总和最小的情况下完成任务。

思路分析:

  1. 周长的计算:每块正方形巧克力板的周长是边长的四倍。如果边长是 a,则这块正方形的周长为 4a,而面积为 a^2

  2. 目标:我们需要选择若干个正方形巧克力板,保证它们的面积之和为 n,并且使得它们的总周长最小。

  3. 动态规划

    • 我们可以用动态规划的方法来解决这个问题,类似于背包问题的变种。
    • 假设我们有一个数组 dp,其中 dp[i] 表示总面积为 i 时的最小周长。
    • 初始条件:dp[0] = 0,因为没有巧克力板时,周长为 0。
    • 状态转移:对于每个 i 和每个可能的正方形边长 a,如果 a^2 小于等于 i,则可以选择边长为 a 的正方形,状态转移为:dp[i]=min⁡(dp[i],dp[i−a2]+4a)*d**p*[*i*]=min(*d**p*[*i*],*d**p*[*i*−*a*2]+4*a*)
    • 最终,我们希望得到 dp[n],即总面积为 n 时的最小周长。

代码实现:

python复制代码def solution(n: int) -> int:
    # dp[i]表示面积为i时的最小周长
    dp = [float('inf')] * (n + 1)
    dp[0] = 0  # 面积为0时周长为0
    
    # 对于每个正方形的边长
    for a in range(1, int(n**0.5) + 1):  # 边长从1到sqrt(n)
        area = a * a  # 正方形的面积
        for i in range(area, n + 1):  # 从面积a^2到n进行状态转移
            dp[i] = min(dp[i], dp[i - area] + 4 * a)  # 更新dp[i]
    
    return dp[n]  # 最小周长
​
if __name__ == '__main__':
    print(solution(n=11) == 20)  # 11的最小周长为20
    print(solution(n=13) == 20)  # 13的最小周长为20
    print(solution(n=25) == 20)  # 25的最小周长为20

代码解释:

  1. 初始化

    • 我们创建了一个 dp 数组,大小为 n + 1,并将所有的值初始化为 infinity,表示这些面积目前无法通过某些正方形巧克力板达到。对于 dp[0],我们设为 0,因为没有巧克力板时,周长为 0。
  2. 循环计算

    • 我们通过外层循环遍历每个可能的正方形边长 a,并计算 a 的面积 area = a^2
    • 内层循环从 arean,更新 dp[i] 的值,计算当前总面积为 i 时,最小的周长。
  3. 返回结果

    • 最终,dp[n] 存储了总面积为 n 时,最小的周长。

时间复杂度:

  • 时间复杂度:我们使用双重循环,外层循环最多遍历 sqrt(n) 次(因为最大边长为 sqrt(n)),内层循环最多遍历 n 次,因此时间复杂度是 O(n * sqrt(n))。
  • 空间复杂度:我们使用一个大小为 n + 1 的数组来存储最小周长,因此空间复杂度是 O(n)。

示例测试:

  1. 输入:n = 11

    • 最优方案是选取两个边长为 3 的正方形(面积 9)和一个边长为 2 的正方形(面积 4),总面积为 11,总周长为 20。
    • 输出:20
  2. 输入:n = 13

    • 最优方案是选取一个边长为 3 的正方形(面积 9)和一个边长为 2 的正方形(面积 4),总面积为 13,总周长为 20。
    • 输出:20
  3. 输入:n = 25

    • 最优方案是选取一个边长为 5 的正方形(面积 25),总面积为 25,总周长为 20。
    • 输出:20

该算法能有效解决问题,并返回最小周长的最优解。