素数伴侣
素数伴侣
http://www.nowcoder.com/questionTerminal/b9eae162e02f4f928eac37d7699b352e
先声明,本解法用的不是前面提过的匈牙利解法。那个我还不会,我只是想把自己的解法先捣鼓通了再去学匈牙利算法。
再顺便备注一条,希望能帮助到被“输出为空”这个错误提示恶心到的朋友们:在获取输入的时候,一定要用while(sc.hasNext())循环获取。因为有的题目你不用while,它会每个输入案例都重新启动你的代码,然后输入,但这道题你自己不用while,就没法获取到后面的输入了。因为这,这道题第二个案例提示我输出为空时我好久没想到原因在哪。
言归正传,我的思路是这样:
1.只有奇数+偶数才可能得到素数。
2.获取n个整数时,奇数从前往后放,偶数从后往前放,这样,奇数都在前面,偶数都在后面。
3.每个奇数去匹配后面的偶数,和为素数的都记录下来。
4.如果一个奇数只能与一个偶数A匹配,那就把其他奇数的匹配偶数里的这个偶数A都删掉。如果在删的过程中,某个奇数的匹配偶数个数为0,把这个奇数删掉。
5.最后剩下的,一定是每个奇数至少匹配两个偶数,每个偶数至少可以匹配一个奇数。这样的话,他们匹配的最大数量一定是奇数个数和偶数个数中的较小值。
6.可以将已经处理过的这种1对1的组合单独存放,以免对第4步产生干扰。这样,最大值应该等于第5步中的较小值加上单独存放的个数。
7.返回最大值。
代码如下,欢迎大家提出改进意见和思路漏洞,共同探讨:
import java.util.*; public class Main{ public static ArrayList<ArrayList<Integer>> aal; public static ArrayList<Integer> only; public static int max; public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()) { int sum=sc.nextInt(); int[] all=new int[sum]; aal=new ArrayList<ArrayList<Integer>>(); int loc=0,loc2=sum-1; for(int i=0;i<sum;i++){ int n=sc.nextInt(); if(n%2==0) { all[loc2--]=n; }else { all[loc++]=n; } } for(int i=0;i<loc;i++) { ArrayList<Integer> al=new ArrayList<Integer>(); al.add(all[i]); for(int j=loc;j<sum;j++) { if(isPrime(all[i]+all[j])){ al.add(all[j]); } } if(al.size()>1) { aal.add(al); } } max=0; seek(); System.out.println(max); } } public static boolean isPrime(int n){ boolean b=true; for(int i=2;i<=Math.pow(n, 0.5);i++){ if(n%i==0){ b=false; break; } } return b; } public static void seek(){ only=new ArrayList<Integer>(); ArrayList<Integer> al; do { al=null; for(int i=0;i<aal.size();i++) { if(aal.get(i).size()==2) { al=aal.get(i); aal.remove(i); break; } } if(al==null) { break; } int n=al.get(1); only.add(n); for(int i=0;i<aal.size();i++) { ArrayList<Integer> buf=aal.get(i); for(int j=1;j<buf.size();j++) { if(buf.get(j)==n) { buf.remove(j); if(buf.size()==1) { aal.remove(i); i--; } break; } } } }while(true); HashSet<Integer> hs=new HashSet<Integer>(); for(int i=0;i<aal.size();i++) { al=aal.get(i); for(int j=1;j<al.size();j++) { hs.add(al.get(j)); } } int len=only.size(); int len2=aal.size(); int len3=hs.size(); if(len2>len3) { max=len+len3; }else { max=len+len2; } } }