HJ28 素数伴侣

发布时间 2023-04-27 15:35:10作者: Aneverforget

高赞答案

 

参考,通过全部用例高赞,重写代码如下:

 

 

虽然自己写了一天,只通过4个用例,还是把代码粘贴上来或许,希望错误中也能有一些洞见吧。

 1 '''
 2 #思路
 3 #递归方法:
 4 举例,从头考试两两成对,如2,5,6,13,12,11,10
 5 1、第一次探索 2,5|6,13|12,11|10,记录素数伴侣的对数
 6 2、后释放一对12,11,重新配对2,5|6,13|12|11,10;2,5|6,13|11|12,10;
 7 共2组,记录素数伴侣的对数
 8 (3、若数列刚好成对,需要释放两队后重新配对,如数列少一个元素10。
 9 重新配对2,5|6,12|13,11;2,5|13,12|6,11,共2组,分别记录素数对数
10 4、再释放一队。
11 重新配对2,12|6,13|5,11;12,5|6,13|2,11;2,6|5,13|12,11;
12        6,5|2,13|12,11;共4组,分别记录素数对数)
13 5、再释放一队6,13,重新配对
14      2,5|6,12|13,11|10;2,5|12,13|6,11|10;
15      2,5|6,11|12|13,10;2,5|13,11|12|6,10
16      2,5|6,12|11|13,10;2,5|13,12|11|6,10;共6组,分别记录素数伴侣的对数
17 依次递推
18 最重要的是recouple的方法:
19 '''
20 def check(n):
21     for i in range(2,n):
22         if n%i==0:
23             return False  
24     return True
25 def recouple(couple,c,i):
26     coup=couple.copy()
27     t=c.copy()
28     #print(c,i)
29     if i%2==0:
30         couple.append([c[0],c[i]])
31         couple.append([c[1],c[i+1]])
32         t[0],t[1],t[i],t[i+1]=0,0,0,0        
33     if i%2!=0:
34         couple.append([c[0],c[i]])
35         couple.append([c[1],c[i-1]])
36         t[0],t[1],t[i],t[i-1]=0,0,0,0
37     for i in range(4):
38         t.remove(0)
39     for i in range(0,len(t),2):        
40         couple.append(t[i:i+2])
41     #print(couple)
42     return coup
43 def reduce(temp):
44     tem=[]
45     for i in temp:
46         for j in i:
47             tem.append(j)
48     return tem
49 def recursion(a,couple,perc,flag=1,release=0):
50     if release>=len(couple)+1 and len(couple)!=1:
51         #print("done",release,couple)
52         return
53     if len(couple)>=len(a)//2:
54         c=0
55         for i in couple:
56             if check(sum(i)):
57                 c+=1            
58         res.append(c)
59     if len(couple)==1:
60         #print("done1")
61         return
62     
63     if flag==1:
64         for temp in range(0,len(a),2):
65             couple.append(a[temp:temp+2])
66         perc=couple.copy()
67         recursion(a,couple,perc,flag=0,release=2)      
68     if flag==0:
69         #print(release)
70         temp=perc[-release:]
71         tem=reduce(temp)
72         couple=perc[:-release]
73         for i in range(2,len(tem)): # 对释放出来的couple数一一互换               
74             coup=recouple(couple,tem,i)
75             c=0
76             for i in couple:
77                 if check(sum(i)):
78                     c+=1            
79             res.append(c)
80             couple=coup.copy()
81         couple=perc
82         recursion(a,couple,perc,flag=0,release=release+1) #逐渐增加释放couple数。
83 no=int(input())
84 a=list(map(int,input().split()))      
85 res=[]
86 perc=[]
87 couple=[]
88 recursion(a,couple,perc)
89 print(max(res))