题解 | #素数伴侣#

素数伴侣

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Scanner;
import java.util.stream.Collectors;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String nextLine = in.nextLine();
            if (Objects.isNull(nextLine) || nextLine.equals("")) {
                break;
            }
            int n = Integer.parseInt(nextLine);
            List<Integer> collect = Arrays.stream(in.nextLine()
                .split(" "))
                .map(Integer::parseInt)
                .collect(Collectors.toList());
            // 记录已计算的是否为质数:只能被1和它自身整除的数
            Map<Integer, Boolean> record = new HashMap<>();
            List<Cord> indexMap = new ArrayList<>();
            // 冒泡所有组合,将奇数放在右侧,偶数放在左侧,由于奇数+奇数=偶数,偶数+偶数=偶数,偶数不为素数(质数),所以这是完美的二分图匈牙利算法
            for (int i = 0; i < n; i++) {
                for (int j = i; j < n; j++) {
                    if (valid(record, collect.get(i) + collect.get(j))) {
                        if (collect.get(i) % 2 == 0) {
                            indexMap.add(new Cord(i, j));
                        } else {
                            indexMap.add(new Cord(j, i));
                        }
                    }
                }
            }
            // 获取所有的x
            List<Integer> collect1 = indexMap.stream()
                .map(item -> item.getFrom())
                .distinct()
                .collect(Collectors.toList());
            // 获取所有的y
            List<Integer> collect2 = indexMap.stream()
                .map(item -> item.getTo())
                .distinct()
                .collect(Collectors.toList());
            Map<Integer, Integer> yxMap = new HashMap<>();
            // 记录Y是否被占用
            Map<Integer, Boolean> booleanyMap = new HashMap<>();

            // 遍历所有的x
            for (int i = 0; i < collect1.size(); i++) {
                // 记录x是否已经换过y
                Map<Integer, Boolean> booleanxMap = new HashMap<>();
                Integer x = collect1.get(i);
                dfs(yxMap, booleanyMap, booleanxMap, indexMap, x);
            }
            // System.out.println(indexMap);
            System.out.println(yxMap.size());
        }

    }

    //22
    // 20923 22855 2817 1447 29277 19736 20227 22422 24712 27054 27050 18272 5477 27174 13880 15730 7982 11464 27483 19563 5998 16163
    public static boolean dfs(Map<Integer, Integer> yxMap, Map<Integer, Boolean> booleanyMap,
        Map<Integer, Boolean> booleanxMap, List<Cord> indexMap, Integer x) {

        List<Integer> yList = indexMap.stream()
            .filter(item -> item.getFrom() == x)
            .map(item -> item.getTo())
            .collect(Collectors.toList());
        for (Integer y : yList) {
            if (Objects.isNull(booleanyMap.get(y))) {
                booleanyMap.put(y, true);
                yxMap.put(y, x);
                booleanxMap.put(x, true);
                return true;
            }
            // 这个lastX有可能是抢人的x
            Integer lastX = yxMap.get(y);
            // 逼上一个x去找别的y找不到就false
            if (Objects.isNull(booleanxMap.get(lastX))) {
                booleanxMap.put(lastX, true);
                // 如果上一个x能找到y,那就更新这个y给当前x
                if (dfs(yxMap, booleanyMap, booleanxMap, indexMap, lastX)) {
                    yxMap.put(y, x);
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean valid(Map<Integer, Boolean> record, Integer integer) {
        if (Objects.isNull(record.get(integer))) {
            for (int i = 2; i <= Math.sqrt(integer); i++) {
                if (integer % i == 0) {
                    record.put(integer, false);
                    return false;
                }
            }
            record.put(integer, true);
            return true;
        }
        return record.get(integer);
    }
}

class Cord {
    Integer from;

    Integer to;

    public Cord(Integer from, Integer to) {
        this.from = from;
        this.to = to;
    }

    @Override
    public String toString() {
        return "Cord{" + "from=" + from + ", to=" + to + '}';
    }

    public Integer getFrom() {
        return from;
    }

    public void setFrom(Integer from) {
        this.from = from;
    }

    public Integer getTo() {
        return to;
    }

    public void setTo(Integer to) {
        this.to = to;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-20 17:02
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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