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

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

相关文章
|
6月前
|
传感器 安全
一款高温型霍尔效应传感器
一、产品概述 HAL443A单极性霍尔位置传感器是由内部电压稳压器、霍尔电压发生器、差分 放大器、温度补偿单 元、施密特触发器和集 电极开路输出级组成的磁敏传感电路,其输入为磁感应强度,输出是一个数字电压 信号。它是一种单磁极工作的磁敏电路,适合于矩形或者柱形磁体下工作。工作温度范围为-40 ℃ ~150 ℃,电源电压工作范围为 3.8V~30V ,负载电流能力最高可达到 50mA,封装形式为 SIP3L(TO-92UA)。 二、产品特点 电源电压范围宽,输出电流大。 开关速度快,无瞬间抖动。 工作频率宽(0~100KHz)。 寿命长、体积小、安装方便。 能直接和逻辑电路接
|
机器学习/深度学习 传感器 算法
【地震】基于有限差分 (FDTD) 模拟地震超材料(晶体)时域分析附matlab代码
【地震】基于有限差分 (FDTD) 模拟地震超材料(晶体)时域分析附matlab代码
|
算法
风、光、负荷出力各场景及概率、场景削减、负荷点的拉丁超立方抽样(Matlab代码实现)
风、光、负荷出力各场景及概率、场景削减、负荷点的拉丁超立方抽样(Matlab代码实现)
164 0
|
算法 数据挖掘 调度
【场景削减】基于 Kantorovich 距离的 SBR 算法场景削减研究(Matlab代码实现)
【场景削减】基于 Kantorovich 距离的 SBR 算法场景削减研究(Matlab代码实现)
194 0
|
存储 算法 数据中心
基于蓄电池进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实
基于蓄电池进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实
|
机器学习/深度学习 传感器 算法
基于拉丁超立方模拟生成10个经典场景风机出力和电价的场景模拟和削减附matlab代码
基于拉丁超立方模拟生成10个经典场景风机出力和电价的场景模拟和削减附matlab代码
|
机器学习/深度学习 存储 算法
量子计算机遇到新对手?随机磁电路,因数分解更厉害
现在如果我给你一个400位的数字,事实证明你很难直接分解出它的因数。两个数的乘法很容易,如果把两个200位的数相乘,你可以很快的计算出结果。如果用计算机来计算的话,甚至会更快。但是一个400位的数字,让你计算出它的两个因数,你很难解出来。
量子计算机遇到新对手?随机磁电路,因数分解更厉害
时空不平坦,能量不守恒。大爆炸时粒子凭空产生的情形
时空不平坦,能量不守恒。大爆炸时粒子凭空产生的情形
48 0
时空不平坦,能量不守恒。大爆炸时粒子凭空产生的情形
|
Python
OBV指标交易策略(累积能量潮与移动能量潮,成交量多空比率净额及相关应用原则)
OBV指标交易策略(累积能量潮与移动能量潮,成交量多空比率净额及相关应用原则)
900 0
OBV指标交易策略(累积能量潮与移动能量潮,成交量多空比率净额及相关应用原则)
|
传感器 智能硬件
液体测量技术:从水到血液
液体测量技术:从水到血液
液体测量技术:从水到血液