- 每次先统计每个数能够和几个数成功匹配
- 把不能匹配的数删去,然后找到匹配方法最少的数 X
- 找出能和X匹配的数中匹配方法数最少的数Y
- 把X、Y作为一对匹配,然后删除X、Y,继续寻找下一对匹配的数直到没有数可以匹配就结束。
#include <bits/stdc++.h>
using namespace std;
int n,minpair=1,ans=0;
int A[110]={0},B[110]={0};
int isprime[60001]={0};
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>A[i];
}
for(int i=2;i<=60000;i++){
isprime[i]=1;
}
for(int i=2;i<=60000;i++){
if(isprime[i]){
//cout<<i<<endl;
for(int j=2*i;j<=60000;j+=i){
isprime[j]=0;
}
}
}
while(1){
int k=0;
minpair=0;
B[0]=1e9;
for(int i=1;i<=n;i++){
B[i]=0;
}
for(int i=1;i<=n;i++){//统计所有数的匹配方法数
k+=A[i];
if(A[i]==0) continue;//已经匹配过的数为0,跳过
for(int j=i+1;j<=n;j++){
if(A[j]==0) continue;
if(isprime[A[i]+A[j]]){
B[i]++;
B[j]++;
}
}
if(B[i]==0){//无法匹配,直接删除
A[i]=0;
continue;
}
if(B[minpair]>B[i]) minpair=i;
}
if(minpair==0) break;
int minpair2=0;
for(int i=1;i<=n;i++){
if(A[i]!=0&&i!=minpair && isprime[A[i]+A[minpair]]){
if(B[minpair2]>B[i]) minpair2=i;
}
}
ans++;
A[minpair]=0;
A[minpair2]=0;
}
cout<<ans;
return 0;
}