题解 | #素数伴侣#

素数伴侣

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

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    private static List<Integer> odds = new ArrayList<>();
    private static List<Integer> evens = new ArrayList<>();
    private static boolean[] isEvenVisited;
    private static int[] evenMatchedOdd;

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        while(in.hasNext()){
            solution(in);
        }
    }

    /**
     * 匈牙利算法
     * @param in
     */
    private static void solution(Scanner in){
        int N = in.nextInt();

        for(int i=0; i<N; i++){
            int num = in.nextInt();
            if(num%2 == 0){
                odds.add(num);
            }else{
                evens.add(num);
            }
        }

        // 当前序号对应的偶数匹配的素数伴侣(奇数)
        evenMatchedOdd = new int[evens.size()];

        int count = 0;
        for(Integer odd: odds){
            isEvenVisited = new boolean[evens.size()];
            if(find(odd)){
                count++;
            }
        }

        System.out.println(count);
    }

    /**
     * 查找当前奇数的素数伴侣(偶数)
     * @param odd
     * @return
     */
    private static boolean find(int odd){
        for(int i=0; i<evens.size(); i++){
            if(!isEvenVisited[i] && isPrime(odd+evens.get(i))){
                isEvenVisited[i] = true;
                // 能让则让
                if(evenMatchedOdd[i]==0 || find(evenMatchedOdd[i])){
                    evenMatchedOdd[i] = odd;
                    return true;
                }
            }
        }

        return false;
    }

    private static boolean isPrime(int num){
        for(int i=2; i<=(int)(Math.sqrt(num)); i++){
            if(num%i == 0){
                return false;
            }
        }

        return true;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 13:05
TMD找工作本来就烦,这东西什么素质啊😡
Beeee0927:hr是超雄了,不过也是有道理的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务