题解 | #素数伴侣#

素数伴侣

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

#include <cmath>
#include <iostream>
#include <vector>
using namespace std;

bool PrimeMate(int x, int y){//判断两个数是不是素数伴侣
    int a = x + y;
    for(int i = 2; i <= sqrt(a); i++){
        if(a % i == 0) return false;;
    }
    return true;
}

bool find(int num, vector<int>& evens, vector<bool>& i_used, vector<int>& match){//对于奇数集合中的一个数num,寻找偶数集合中是否有数能与其配对
    for(int j = 0; j < evens.size(); j++){
        if(PrimeMate(num, evens[j]) && !i_used[j]){
            i_used[j] = true;//当前偶数已经被该基数考虑过
            if(match[j] == -1 || find(match[j], evens, i_used, match)){//当前偶数未配对或所配对的奇数还有其他配对方式
                match[j] = num;
                return true;
            }
        }
    }
    return false;
}

int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    vector<int> odds;
    vector<int> evens;
    for(int i = 0; i < n; i++){
        cin >> nums[i];
        if(nums[i] % 2) evens.push_back(nums[i]);
        else odds.push_back(nums[i]);
    }
    if(odds.size() == 0 || evens.size() == 0) cout << 0 << endl;//如果所给序列中只有奇数或只有偶数,则没有素数伴侣(除了2之外,所有素数都是奇数)
    else{
        int count = 0;
        vector<int> match(evens.size(), -1);//记录与偶数配对的奇数
        for(int i = 0; i < odds.size(); i++){
            vector<bool> i_used(evens.size(), false);
            if(find(odds[i], evens, i_used, match)) count ++;
        }
        cout << count << endl;
    }
    return 0;
}

全部评论
不知道匈牙利算法,根本不会做
点赞 回复 分享
发布于 2024-03-08 13:29 河北

相关推荐

06-19 13:40
武汉大学 Java
点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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