题解 | #素数伴侣#
素数伴侣
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
查看19道真题和解析
