题解 | #素数伴侣#

素数伴侣

http://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e

'''
匈牙利算法(求二分图的最大匹配):要用到递归,思想:后来者居上
'''
import sys
#1.判断是否是素数(若在1到该数平方根之间都没有可除尽的数)
def is_prime(num):
    if num == 1:
        return False
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

#2.寻找'增广路径'(这个数可否匹配,该跟谁连)
def find(odd, visited, choose, evens):
    for j, even in enumerate(evens):#扫描每个待被匹配的even
        if is_prime(odd + even) and not visited[j]:
            visited[j] = True
            if choose[j] == 0 or find(choose[j], visited, choose, evens):
                #如果第j位even还没被选 或者 选它的那个odd还有别的选择even可以选择,那就把这位even让给当前的odd
                choose[j] = odd
                return True #说明匹配
    return False

#3.开始odd先生和even小姐们入场,并各自到自己队列,开始匹配
while True:
    try:
        n = int(input())
        nums = list(map(int, input().split()))
        count = 0
        #奇数+奇数 = 偶数, 偶数 + 偶数 = 偶数,都不能成为素数.只能奇数+偶数的组合才有可能
        odds,evens = [], []#把数分为奇数和偶数
        #每次拿一个数,添加到对应的list里
        for num in nums:
            if num % 2 == 1:
                odds.append(num)
            else:
                evens.append(num)

        #对每个odd,去找自己的even
        choose = [0] * len(evens) #用来装匹配这位even的对应的odd先生
        for odd in odds:
            visited = [False] * len(evens)
            if find(odd, visited, choose, evens):
                count += 1
        print(count)
    except:
#         print(sys.exc_info())
        break













全部评论

相关推荐

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