小U的防御解析 | 豆包MarsCode AI刷题

56 阅读3分钟

问题描述

小U最近沉迷于一款冒险游戏,在闯关过程中,他通过击败小兵获得了防御宝石,每个防御宝石的价值为 𝑎 𝑖 a i ​ 。经过一番激战,小U终于遇到了关底的boss,这个boss拥有攻击宝石,每颗攻击宝石的价值为 𝑏 𝑖 b i ​ 。小U想知道他手中的防御宝石是否能够抵抗住boss的攻击。 小U的防御成功条件是:所有防御宝石的乘积 ∏𝑖=1 𝑛 𝑎 𝑖 ∏ i=1 n ​ a i ​ 可以被所有攻击宝石的乘积 ∏ 𝑖 1 𝑚 𝑏 𝑖 ∏ i=1 m ​ b i ​ 整除。你能帮小U判断他是否能够抵抗住boss的攻击吗?

测试样例

样例1:

输入:n = 2 ,m = 5 ,arrayn = [10, 12] ,arraym = [2, 3, 5, 2, 1] 输出:'yes'

样例2:

输入:n = 4 ,m = 5 ,arrayn = [7, 2, 5, 3] ,arraym = [2, 4, 5, 6, 1] 输出:'no'

样例3:

输入:n = 3 ,m = 4 ,arrayn = [6, 3, 9] ,arraym = [2, 3, 4, 1] 输出:'no'

解题思路

质因数分解:将每个防御宝石和攻击宝石的值进行质因数分解。

统计质因数:统计每个质因数在防御宝石和攻击宝石中的出现次数。

比较质因数:对于每个质因数,防御宝石中的出现次数必须大于等于攻击宝石中的出现次数。

代码实现(以PYthon实现)

def solution(n, m, arrayn, arraym): from collections import defaultdict

# 质因数分解函数
def prime_factors(num):
    factors = defaultdict(int)
    divisor = 2
    while num >= 2:
        while num % divisor == 0:
            factors[divisor] += 1
            num //= divisor
        divisor += 1
    return factors

# 统计防御宝石的质因数
defense_factors = defaultdict(int)
for num in arrayn:
    factors = prime_factors(num)
    for factor, count in factors.items():
        defense_factors[factor] += count

# 统计攻击宝石的质因数
attack_factors = defaultdict(int)
for num in arraym:
    factors = prime_factors(num)
    for factor, count in factors.items():
        attack_factors[factor] += count

# 比较质因数
for factor, count in attack_factors.items():
    if defense_factors[factor] < count:
        return "no"

return "yes"

if __name__ == "__main__":
    print(solution(2, 5, [10, 12], [2, 3, 5, 2, 1]) == "yes")
    print(solution(4, 5, [7, 2, 5, 3], [2, 4, 5, 6, 1]) == "no")

关键步骤解释

质因数分解函数:prime_factors 函数用于将一个数分解为质因数,并统计每个质因数的出现次数。

统计质因数:分别统计防御宝石和攻击宝石的质因数。

比较质因数:对于每个质因数,检查防御宝石中的出现次数是否大于等于攻击宝石中的出现次数。

可能遇到的问题: 如何判断一个数的质因数分解?

思路

质因数分解是将一个正整数分解为若干个质数的乘积的过程。我们可以通过以下步骤来实现质因数分解: 步骤

初始化:从最小的质数2开始,逐步尝试将目标数除以当前质数。

除法操作:如果目标数能被当前质数整除,则记录该质数,并将目标数除以该质数,继续尝试除以该质数,直到不能整除为止。

递增质数:如果目标数不能被当前质数整除,则尝试下一个质数。

终止条件:当目标数小于等于1时,分解结束。

代码实现

from collections import defaultdict

def prime_factors(num):
    factors = defaultdict(int)
    divisor = 2
    while num >= 2:
        while num % divisor == 0:
            factors[divisor] += 1
            num //= divisor
        divisor += 1
    return factors

# 示例
print(prime_factors(10))  # 输出: defaultdict(<class 'int'>, {2: 1, 5: 1})
print(prime_factors(12))  # 输出: defaultdict(<class 'int'>, {2: 2, 3: 1})
print(prime_factors(24))  # 输出: defaultdict(<class 'int'>, {2: 3, 3: 1})

解释及注意事项

解释

初始化:factors 是一个 defaultdict,用于存储每个质因数的出现次数。divisor 从2开始。

除法操作:在 while num % divisor == 0 循环中,如果 num 能被 divisor 整除,则将 divisor 记录到 factors 中,并将 num 除以 divisor。

递增质数:如果 num 不能被 divisor 整除,则 divisor 递增1,尝试下一个可能的质数。

终止条件:当 num 小于等于1时,分解结束。

注意

这个函数返回一个 defaultdict,其中键是质因数,值是该质因数的出现次数。 这个方法适用于正整数。

总结

该题主要考察了质因数,难度偏大。