一、题目
二、示例
三、代码
def isPrime(x): # 定义判断是否是素数的函数
for i in range(2, int(x ** 0.5) + 1):
if x % i == 0:
return False
return True
def match(odd): # 奇数和偶数的匹配
for i in range(n):
if isPrime(odd + evens[i]) and temp[i] == 0:
temp[i] = 1
if p[i] == 0 or match(p[i]):
p[i] = odd
return True
return False
while True:
try:
n = int(input())
nums = list(map(int, input().split()))
odds = []
evens = []
for num in nums:
if num % 2 == 0:
evens.append(num)
else:
odds.append(num)
n = len(evens)
res = 0
p = [0] * n
for num in odds:
temp = [0] * n
if match(num):
res += 1
print(res)
except:
break
四、算法说明
如果是素数,一定是奇数和偶数结合才有可能是素数,所以将需要配对的数分为两组,一组是奇数,一组是偶数,通过匈牙利算法(鸠占鹊巢)求得最大的配对数。
- 定义判断素数的函数
isPrime()
。 - 定义奇数和偶数的匹配函数
match()
:
遍历所有的偶数,看是否和当前奇数odd
匹配,如果两数和为素数,且该偶数在没有被访问,将该偶数标记为已访问temp[i] = 1
;用p[i] == odd
表示该偶数对应的奇数,如果p[i] == 0
表示还未匹配,或者match(p[i])
有其他可以匹配的偶数,那么将当前偶数的匹配对象替换为当前偶数p[i] = odd
,并返回True
。 - 输出最终结果。
胡萝卜
2022年3月4日14:34:11
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |