关于《海岛奇兵》中n点能量可造成最大伤害的计算

简介: 关于《海岛奇兵》中n点能量可造成最大伤害的计算

最近在玩海岛奇兵, 里面有

武器A, 第n次使用消耗(10 + 6 * (n - 1))点能量并造成18315伤害;

武器B, 第n次使用消耗 (3 + 2 * (n - 1))点能量并造成8124伤害,


就想着能不能写一个程序计算一下, 当有x点能量时, 可造成的最大伤害是多少? 分别使用AB武器各多少次?

讨论: https://leetcode.cn/circle/discuss/vZu06x/


总觉得除了暴力还有更好的算法, 但是不知道怎么做


def multiple_rocket_launcher(n: int):
    """
    计算多管火箭发射器造成的伤害值
    :param n: 发射的火箭数量
    :return: 返回伤害值
    """
    return 10 + 6 * (n - 1)


def artillery(n: int):
    """
    计算火炮造成的伤害值
    :param n: 发射的火炮数量
    :return: 返回伤害值
    """
    return 3 + 2 * (n - 1)


def multiple_rocket_launcher_total_energy(n: int):
    """
    计算发射 n 枚多管火箭发射器需要的总能量值
    :param n: 发射的火箭数量
    :return: 返回总能量值
    """
    return n * (10 + multiple_rocket_launcher(n)) // 2


def artillery_total_energy(n: int):
    """
    计算发射 n 枚火炮需要的总能量值
    :param n: 发射的火炮数量
    :return: 返回总能量值
    """
    return n * (3 + artillery(n)) // 2


def max_multiple_rocket_launcher_count(energy_value: int):
    """
    计算 energy_value 点能量值最多可以发射多少枚多管火箭发射器
    :param energy_value: 可消耗的能量值
    :return: 返回最多可以发射的多管火箭发射器数量
    """
    multiple_rocket_launcher_count = 0
    while multiple_rocket_launcher_total_energy(multiple_rocket_launcher_count + 1) <= energy_value:
        multiple_rocket_launcher_count += 1
    return multiple_rocket_launcher_count


def max_artillery_count(energy_value: int):
    """
    计算 energy_value 点能量值最多可以发射多少枚火炮
    :param energy_value: 可消耗的能量值
    :return: 返回最多可以发射的火炮数量
    """
    artillery_count = 0
    while artillery_total_energy(artillery_count + 1) <= energy_value:
        artillery_count += 1
    return artillery_count


def maximum_injury_value(energy_value: int):
    """
    计算 energy_value 点能量值可造成的最大伤害值
    :param energy_value: 可消耗的能量值
    :return: 返回最大伤害值
    """
    if energy_value <= 0:
        print("能量值必须大于0")
        return
    multiple_rocket_launcher_injury_value = 18315
    artillery_injury_value = 8124
    i = max_multiple_rocket_launcher_count(energy_value)
    use_list = []
    while i >= 0:
        surplus = energy_value - multiple_rocket_launcher_total_energy(i)
        j = max_artillery_count(surplus)
        total_damage = i * multiple_rocket_launcher_injury_value + j * artillery_injury_value
        # print(f"多管火箭发射器数量:{i}, 火炮数量:{j}, 伤害值", "{:,}".format(total_damage))
        use_list.append((i, j, total_damage))
        i -= 1

    # 根据伤害值排序
    use_list.sort(key=lambda x: x[2], reverse=True)
    return use_list[0]
   

或者递归, 效率很低但是代码很优雅简洁

int dfs(int i, int j, int energy) {
  int energy_a = 10+6*(i-1);
  int energy_b = 3+2*(j-1);

  int damage_a = 0;
  int damage_b = 0;

  //选择火箭递归
  if (energy_a <= energy)
    damage_a = dfs(i+1, j, energy - energy_a) + 18315;
  //选择火炮递归
  if (energy_b <= energy)
    damage_b = dfs(i, j+1, energy - energy_b) + 8124;

  return max(damage_a, damage_b);
}

int main() {
  int energy = 100;
  int res = dfs(1, 1, energy);
  return 0;
}

//作者:changelog
//链接:https://leetcode.cn/circle/discuss/vZu06x/view/vXS6oX/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

然后对常有能量值画了个图

相关文章
|
移动开发 小程序 JavaScript
(一)、项目介绍及知识点概述【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
(一)、项目介绍及知识点概述【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
329 0
|
4月前
|
机器学习/深度学习 数据采集 人工智能
基于PAI-ChatLearn的GSPO强化学习实践
近期,阿里通义千问团队创新性提出了GSPO算法,GSPO 算法与其他 RL 算法相比,定义了序列级别的重要性比率,并在序列层面执行裁剪、奖励和优化。同时具有强大高效、稳定性出色、基础设施友好的突出优势。
|
机器学习/深度学习 人工智能 运维
智能化运维####
本文深入探讨了智能化运维的前沿趋势与实践,通过融合大数据、人工智能等先进技术,重塑传统IT运维模式。我们分析了智能化运维的核心价值,包括提升效率、减少故障响应时间及增强系统稳定性,并通过具体案例展示了其在现代企业中的应用成效。对于追求高效、智能运维管理的组织而言,本文提供了宝贵的洞见和策略指导。 ####
|
11月前
|
Windows
Office Tool Plus 永恒经典,让每个人都能轻松使用上免费的办公神器!
本文介绍如何使用Office Tool Plus在Windows 11系统上快速、免费安装和激活Office。首先,下载并解压Office Tool Plus,启动后选择“Microsoft 365企业应用版”并设置为简体中文,点击“开始部署”。安装完成后,可通过两种方法激活Office:一是使用命令框输入特定指令,二是通过KMS激活。推荐使用KMS服务器(如kms.loli.beer)进行激活。此外,若之前安装过Office,需先清除激活信息和旧版本残留文件,以确保新安装顺利进行。
7630 9
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
434 2
|
Dragonfly 安全 数据安全/隐私保护
什么是WPA3?与WPA2有啥区别?
【4月更文挑战第14天】
11478 2
什么是WPA3?与WPA2有啥区别?
|
存储 Linux 虚拟化
用户空间 I/O HOWTO【ChatGPT】
用户空间 I/O HOWTO【ChatGPT】
|
存储 SQL 前端开发
瑞吉外卖精华部分总结(1)
瑞吉外卖精华部分总结(1)
450 0
|
监控 安全 Java