题解 | 素数伴侣

素数伴侣

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

import java.util.*;

public class Main {
    // 判断是否为素数
    private static boolean isPrime(int num) {
        if (num < 2) return false;
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
    
    // 使用匈牙利算法寻找最大匹配
    private static boolean find(int x, boolean[] used, int[] match, List<Integer> odds, List<Integer> evens) {
        for (int i = 0; i < evens.size(); i++) {
            if (!used[i] && isPrime(odds.get(x) + evens.get(i))) {
                used[i] = true;
                if (match[i] == -1 || find(match[i], used, match, odds, evens)) {
                    match[i] = x;
                    return true;
                }
            }
        }
        return false;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        // 将输入数字分为奇数组和偶数组
        List<Integer> odds = new ArrayList<>();
        List<Integer> evens = new ArrayList<>();
        
        for (int i = 0; i < n; i++) {
            int num = sc.nextInt();
            if (num % 2 == 0) {
                evens.add(num);
            } else {
                odds.add(num);
            }
        }
        
        int[] match = new int[evens.size()];
        Arrays.fill(match, -1);
        int count = 0;
        
        // 对每个奇数尝试匹配
        for (int i = 0; i < odds.size(); i++) {
            boolean[] used = new boolean[evens.size()];
            if (find(i, used, match, odds, evens)) {
                count++;
            }
        }
        
        System.out.println(count);
        sc.close();
    }
}

全部评论

相关推荐

专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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