题解 | kotori和素因子

kotori和素因子

https://www.nowcoder.com/practice/7b1c858a3e7a41ed8364178979eaae67?tpId=308&tqId=500564&ru=/exam/oj&qru=/ta/algorithm-start/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AC%2594%25E8%25AF%2595%26topicId%3D308

def is_prime(number):
    """
    判断一个数是否为质数
    Args:
        number: 需要判断的数字
    Returns:
        bool: 是否为质数
    """
    if number < 2:
        return False

    # 只需要检查到平方根即可
    for divisor in range(2, int(number ** 0.5) + 1):
        if number % divisor == 0:
            return False

    return True


def find_minimum_prime_factors_sum(
    current_index, used_factors, current_sum, numbers, min_sum
):
    """
    使用深度优先搜索找出每个数的一个质因子,使得这些质因子互不相同且和最小
    Args:
        current_index: 当前处理的数字索引
        used_factors: 已使用的质因子集合
        current_sum: 当前已选质因子的和
        numbers: 输入的数字列表
        min_sum: 当前找到的最小和
    Returns:
        int: 找到的最小和,如果无解则返回float('inf')
    """
    # 基础情况:所有数字都已处理完
    if current_index == len(numbers):
        return min(min_sum, current_sum)

    current_number = numbers[current_index]

    # 尝试当前数字的所有可能质因子
    for factor in range(2, current_number + 1):
        if (
            current_number % factor == 0
            and is_prime(factor)
            and factor not in used_factors
        ):

            # 选择这个质因子
            used_factors.add(factor)
            min_sum = find_minimum_prime_factors_sum(
                current_index + 1, used_factors, current_sum + factor, numbers, min_sum
            )
            # 回溯:移除这个质因子
            used_factors.remove(factor)

    return min_sum


def main():
    """
    主函数:处理输入并输出结果
    """
    # 读取输入
    n = int(input())
    numbers = list(map(int, input().split()))

    # 初始化参数
    used_factors = set()
    initial_min_sum = float("inf")

    # 执行搜索
    result = find_minimum_prime_factors_sum(
        0, used_factors, 0, numbers, initial_min_sum
    )

    # 输出结果
    if result == float("inf"):
        print(-1)
    else:
        print(result)



main()

全部评论

相关推荐

09-14 17:23
门头沟学院
故事和酒66:所以说副业很重要,程序员干到40岁,再怎么也赚300万了,吃吃利息也够活下去
点赞 评论 收藏
分享
渴望wlb的牛油果很...:直说卡第一学历不就行了 非得拐弯抹角
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务