题解 | #素数伴侣#

素数伴侣

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

# # import math

# # def is_prime(a, b):
# #     absum = a + b
# #     for i in range(2, int(math.sqrt(absum)+1)):
# #         if absum % i == 0:
# #             return 0
# #     return 1

# # def match(i):
# #     for j in range(n):
# #         if array[i][j] == 1 and not visited[j]:
# #             visited[j] = True
# #             if match(j) == -1 or match(matched[j]):
# #                 matched[j] = i
# #                 return True
# #     return False

# # num = int(input())
# # data = list(map(int, input().split()))
# # evens = []
# # odds = []
# # for i in data:
# #     if i % 2 == 0:
# #         evens.append(i)
def is_prime(x):
    for i in range(2, int(x**0.5) + 1):
        if x % i == 0:
            return 0
    return 1

def match(i):
    for j in range(m):
        if array[i][j] == 1 and not visited[j]:  # 第j个偶数还没有进行配对,且没被访问过
            visited[j] = True  # 访问第j个偶数
            # 配对成功标准(或):
            # 1、先到先得。该偶数还没有进行配对。
            # 2、能让则让。该偶数虽然进行配对了,但与其配对的奇数能够找到另外的偶数进行配对。
            if matched[j] == -1 or match(matched[j]):  # 这里用到了递归的思想
                matched[j] = i  # 将该偶数与奇数进行配对
                return True  # 配对成功
    return False

n = int(input())
a = list(map(int, input().split()))
odds = []  # 分奇偶数,素数伴侣必为一奇一偶
evens = []
for data in a:
    if data % 2 == 0:
        evens.append(data)
    else:
        odds.append(data)
n = len(odds)
m = len(evens)
array = [[-1 for i in range(m)] for j in range(n)]
for i in range(n):
    for j in range(m):
        array[i][j] = is_prime(odds[i] + evens[j])
# print(array)
matched = [-1 for i in range(m)]  # 记录每一个偶数匹配的奇数
for i in range(n):
    visited = [False for k in range(m)]
    match(i)
print(len(matched) - matched.count(-1))

全部评论

相关推荐

牛客773130651号:巨佬,简历模板换成上下的,左右的很烦,hr看着不爽。。。科大随便乱杀,建议能保研就保研,不行也得考一下 ,985硕去干算法,比开发强多了。开发许多双非都能搞,学历优势用不上,算法有门槛
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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