题解 | #素数伴侣#

素数伴侣

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

import java.util.*;

public class Main {
    static Integer numberCount ;
    static List<Integer> oddsList = new ArrayList<>();
    static List<Integer> evensList = new ArrayList<>();
    static Map<Integer, List<Integer>> map = new HashMap<>();
    static int[] matchOdd ; //存偶数x当前匹配的奇数。
    static int[] matchEven; //存奇数x当前匹配的偶数。
    static Map<Integer, Boolean> usedMarkMap = new HashMap<>();// 偶数是否被使用



    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        numberCount = sc.nextInt();
        matchOdd = new int[30001];
        matchEven = new int[30001];
        for (int i = 0; i < numberCount; i++) {
            int num = sc.nextInt();
            if (num % 2 == 0) {
                evensList.add(num);
            } else {
                oddsList.add(num);
            }
        }
        for (int i = 0; i < oddsList.size(); i++) {
            int odd = oddsList.get(i);
            for (int j = 0; j < evensList.size(); j++) {
                Integer even = evensList.get(j);
                if (isPrime(odd + even)) {
                    if (map.get(odd) == null) {
                        List<Integer> list = new ArrayList<>();
                        list.add(even);
                        map.put(odd, list);
                    } else {
                        map.get(odd).add(even);
                    }
                }
            }
        }

        int ans = 0;
        //匈牙利算法
        for (int i = 0; i < oddsList.size(); i++) {
            if (matchOdd[oddsList.get(i)] == 0) {
                usedMarkMap = new HashMap();
                if (dfs(oddsList.get(i))) ans ++;

            }
        }

        System.out.println(ans);
    }

    public static boolean dfs(int odd) {
        for (int i = 0; i < evensList.size(); i++) {
            int even = evensList.get(i);
            if (null != map.get(odd) && map.get(odd).contains(even) ) {
                 if(null == usedMarkMap.get(even)) {
                    usedMarkMap.put(even,true); 
                    if (matchOdd[even] == 0 || dfs(matchOdd[even])) {
                        matchEven[odd] = even;
                        matchOdd[even] = odd;
                        return true;
                    }
                }
            }
        }

        return false;
    }

    /**
     * 是否是质数
     * @param param
     * @return
     */
    public static boolean isPrime(Integer param) {
        for (int i = 2; i <= Math.sqrt(param); i++) {
            if (param % i == 0) return false;
        }
        return true;
    }
}

全部评论

相关推荐

09-20 22:39
中南大学
故事和酒66:意思就是用了AI辅助也不一定做得出来,还是有区分度,不然他不会让你用的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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