题解 | #素数伴侣#

素数伴侣

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

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

int count = 0, n, num;
// 记录奇数和偶数的数组,对每个偶数去找能够匹配的奇数
vector<int> evens, ods; 
// 记录od是否被访问过的数组。
vector<bool> odIsVisited;
// 记录当前od匹配的even。 原本用字典存的话,如果出现重复奇数的情况,计算结果会出错。
vector<int> odAndEven;

// 判断二者之和是否是素数。
bool isSushu(int a, int b) {
    int num = a + b;
    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

// 成功匹配的话返回true,否则返回false
bool dfs(int even) {
    // 遍历所有的奇数,看能否匹配。
    for (int i = 0; i < ods.size(); i++) {
        int od = ods[i];
        // 如果能够组成素数,那么可以匹配, 继续判断。
        if (isSushu(even, od) && !odIsVisited[i]) {
            // 如果该奇数访问过,那么跳过。
            odIsVisited[i] = 1; // 标记,表示已经访问过。
            if ( !odAndEven[i] || dfs(odAndEven[i]) ) {
                odAndEven[i] = even;
                return true;
            }
        }
    }
    return false;
}

int main() {
    cin >> n;
    while (cin >> num) {
        // cout << num;
        if (num % 2 == 0) {
            evens.push_back(num);
        } else {
            ods.push_back(num);
        }
    }

    odIsVisited.resize(ods.size());
    odAndEven.resize(ods.size());
    fill(odAndEven.begin(), odAndEven.end(), 0);
    // 遍历evens,找ods进行匹配。如果两者相加是素数,则可以配对。
    for (int even : evens) {
        // 每次都初始化odIsVisited为false。表示所有od都没访问过。
        fill(odIsVisited.begin(), odIsVisited.end(), false);
        // 如果even找到了能匹配的ods,则count++. 显然dfs返回bool类型。
        if( dfs(even) ) count++;
    }
    cout << count;

    return 0;
}

全部评论

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务