匈牙利算法+递归 | HJ28 素数伴侣
# 最优解
import math
def is_prime(num):
if num <= 3:
return num > 1
for i in range(2, int(math.sqrt(num))+1):
if num % i == 0:
return False
return True
def match(odd):
for i, even in enumerate(evens):
if not visited_evens[i] and is_prime(odd+even):
visited_evens[i] = True
if pair[i]==0 or match(pair[i]):
pair[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)
cnt = 0
pair = [0]*len(evens)
for odd in odds:
visited_evens = [0] * len(evens)
if match(odd):
cnt += 1
print(cnt)
except:
break
# 我的代码(超时未通过)
import math
def is_prime(n):
if n <= 1:
return False
elif n <= 3:
return True
elif n % 2 == 0 or n % 3 == 0:
return False
for i in range(5, int(math.sqrt(n))+1, 6):
if n % i == 0 or n % (i+2) == 0:
return False
return True
def func(nums, groups, visited):
if sum(visited.values()) == len(nums):
cnt = 0
for group in groups:
if is_prime(group[0]+group[1]):
cnt += 1
# res.append((cnt, groups))
res.append(cnt)
return True
for i in range(len(nums)-1):
if not visited[i]:
visited[i] = True
for j in range(i+1, len(nums)):
if not visited[j]:
visited[j] = True
groups.append((nums[i], nums[j]))
func(nums, groups, visited)
visited[j] = False
groups.pop()
visited[i] = False
while True:
try:
n = int(input())
s = list(map(int, input().split(' ')))
res = []
visited = {i: False for i in range(n)}
func(s, [], visited)
print(max(res))
except:
break
用时:3.5h
华为笔试刷题 文章被收录于专栏
高质量题: 1~40:HJ16,HJ22,HJ24,HJ26,HJ27,HJ28,HJ35,HJ37,HJ39; 40~80:HJ41,HJ42,HJ43,HJ44,HJ48,HJ50,HJ52,HJ53,HJ57,HJ61,HJ63,HJ64,HJ70,HJ71,HJ74,HJ77; 80~108:HJ82,HJ85,HJ88,HJ89,HJ93,HJ95,HJ98,HJ103,HJ107