关于《海岛奇兵》中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)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

相关文章
OFDM——PAPR减小(一)
OFDM——PAPR减小(一)
672 0
|
移动开发 小程序 JavaScript
(一)、项目介绍及知识点概述【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
(一)、项目介绍及知识点概述【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
509 0
|
机器学习/深度学习 数据采集 人工智能
基于PAI-ChatLearn的GSPO强化学习实践
近期,阿里通义千问团队创新性提出了GSPO算法,GSPO 算法与其他 RL 算法相比,定义了序列级别的重要性比率,并在序列层面执行裁剪、奖励和优化。同时具有强大高效、稳定性出色、基础设施友好的突出优势。
|
Dragonfly 安全 数据安全/隐私保护
什么是WPA3?与WPA2有啥区别?
【4月更文挑战第14天】
13090 2
什么是WPA3?与WPA2有啥区别?
|
机器学习/深度学习 存储 人工智能
AI浪潮下,大模型如何在音视频领域运用与实践
LiveVideoStackCon2023深圳站,分享阿里云视频云的大模型算法实践
985 0
Vue3选择器(Select)
该文章介绍了一个基于 Vue2 的选择器组件 `Select`,具备丰富的自定义属性,如选项数据、占位符文本、是否禁用、是否支持清除和搜索等。支持自定义过滤函数,并可调整下拉面板的高度、宽度及显示项数。组件内部集成了 `Empty` 和 `Scrollbar` 组件以增强功能性和用户体验。示例代码展示了如何创建和使用该选择器,包括基本使用、禁用选项、支持清除与搜索等功能。
679 1
Vue3选择器(Select)
|
SQL JSON 关系型数据库
DataX 实现 MySQL 数据,高效同步(二)
DataX 实现 MySQL 数据,高效同步(二)
DataX 实现 MySQL 数据,高效同步(二)
|
存储 Linux 虚拟化
用户空间 I/O HOWTO【ChatGPT】
用户空间 I/O HOWTO【ChatGPT】

热门文章

最新文章