题解 | #素数伴侣#

素数伴侣

https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            int[] nums = new int[n];
            for(int i=0;i<n;i++){
                nums[i] = sc.nextInt();
            }
            ArrayList<Integer> evens = new ArrayList<>();
            ArrayList<Integer> odds = new ArrayList<>();

            for(int i=0;i<n;i++){
                if((nums[i]&1)==1){
                    odds.add(nums[i]);
                }else{
                    evens.add(nums[i]);
                }
            }
            int[] evensMatch = new int[evens.size()];
            int count = 0;
            for(int i=0;i<odds.size();i++){
                int[] used = new int[evens.size()];
                if(find(used,evens,odds.get(i),evensMatch)){
                    count++;
                }
            }
            System.out.println(count);
        }
    }
    public static boolean isPrime(int num){
        for(int i=2;i*i<=num;i++){
            if(num%i==0){
                return false;
            }
        }
        return true;
    }

    public static boolean find(int[] used,ArrayList<Integer> evens,int num,int[] evensMatch){
        for(int i=0;i<evens.size();i++){
            if(isPrime(num+evens.get(i))&&used[i]==0){
                used[i]=1;
                //第二个条件相当于回溯,新的奇数要匹配这个偶数,但是这个偶数已经被旧的奇数占用了
                //那么就让旧的奇数再去找一个新的匹配结果,used保证了不会重复冲突
                if(evensMatch[i]==0||find(used,evens,evensMatch[i],evensMatch)){
                    evensMatch[i] = num;
                    return true;
                }
            }
        }
        return false;
    }

}

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务