题解 | #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%25AF%2587%26topicId%3D308

import sys
import copy

"""
定义L2接收素因子列表
"""
L2 = []
n = int(input())
numbers = list(map(int, input().split()))


def isprime(x):
    """
    判断x是否为素数
    """
    if x == 2:
        return True
    i = 2
    while i < x:
        if x % i == 0:
            return False
        i += 1
        return True


def suyinzi(x):
    """
    先判断i是否是x的因子,然后判断是否是素数,如果是说明是x的素因子,加入到L中,并去重
    """
    L = []
    i = 2
    while i < x:
        if x % i == 0:
            x = int(x / i)
            if isprime(i):
                L.append(i)
        else:
            i += 1
    L.append(x)
    L = list(set(L))
    L.sort()
    return L


# 遍历整数,求出每个整数的素因子
for x in numbers:
    L2.append(suyinzi(x))

L = copy.deepcopy(L2)
#print(L)
L2 = []


for x in L:
    for element in x:
        if element not in L2:
            L2.append(element)

#递归的初始状态为以下,depth是深度,代表进入到第几个整数的素因子选择
sum = 0
visited = [False for i in range(len(L2))]
depth = 0
res = []


def dfs(L, L2, visited, sum, depth, res):
    '''
    每进入一层,就选择一个数字,当进入到最后一层,停止递归
    '''

    if depth == n:
        res.append(sum)
        return

    for i in L[depth]:
        #如果在本层没有找到未被访问的素因子,那停止递归返回-1
        if visited[L2.index(i)] == False:
            sum += i
            depth += 1
            visited[L2.index(i)] = True
            #进入递归,深度+1,更新了visited数组,保证没有重复的素因子被选择
            dfs(L, L2, visited, sum, depth, res)
            #回朔
            sum -= i
            depth -= 1
            visited[L2.index(i)] = False
    
    return res


res = dfs(L, L2, visited, sum, depth, res)
if not res:
    print("-1")
else:
    print(min(res))

全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务