题解 | #素数伴侣#

素数伴侣

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

转换为最大匹配。
算法思路:
- 先到先得
- 能让则让
def is_prime(num):
    if num<2:
        return False
    i = 2
    while i*i<=num:
        if num%i==0:
            return False
        i+=1
    return True
     
def find(odd, evens, visited, selected):
    for i, even in enumerate(evens):
        if is_prime(even+odd) and not visited[i]:
            visited[i]=True  
            # 如果当前偶数没有对象(0),那么就与之组合
            # 就尝试为 selected[i] 协调新对象
            if selected[i] == 0 or find(selected[i],  evens, visited, selected):
                selected[i]=odd
                return True
    # 没有对象
    return False
 
while True:
    try:
        n=int(input())
        nums=list(map(int,input().split(' ')))
        
        # 准备分组
        evens, odds=[], []
        for num in nums:
            if num%2==0:
                evens.append(num)
            else:
                odds.append(num)

        # 尝试为每个奇数匹配偶数        
        selected=[0]*len(evens)    # 记录与第 i 个偶数匹配的奇数
        result = 0
        for odd in odds:
            visited=[0]*len(evens) # 记录访问过的偶数,防止重复访问
            if find(odd, evens, visited, selected):
                result +=1 #匹配成功就把结果+1
        print(result)
    except:
        break



全部评论
这个visited是为每个奇数建立的,递归的时候可以复用嘛?
1 回复 分享
发布于 2022-08-29 21:33 上海
使用旬牙利算法不用考虑奇数数量不等于偶数数量情况吗,旬牙利只能两盒相等时才是准确的哇
点赞 回复 分享
发布于 2023-05-06 22:44 湖北

相关推荐

09-25 13:56
门头沟学院 Java
V进厂倒计时:直接外包给你还不要出钱,完美
点赞 评论 收藏
分享
头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务