题解 | #素数伴侣#
素数伴侣
https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// 输入数据
const n = parseInt(await readline());
const nums = (await readline()).split(" ").map(Number);
const odds = nums.filter((item) => item % 2),
evens = nums.filter((item) => item % 2 === 0);
// 判断素数
const isPrime = (num) => {
const n = Math.floor(Math.sqrt(num))+1;
for (let i = 2; i < n; i++) {
if (num % i === 0) return false;
}
return num != 1;
};
// 匈牙利算法
const find = (odd, evens, evenMatch, match) => {
for (let i = 0; i < evens.length; i++) {
const even = evens[i];
// 如果这个偶数未被占用,并且和奇数的和是素数
if (!match[i] && isPrime(even + odd)) {
match[i] = true;// 标记这个偶数已被占用
// 如果这个偶数没有伴侣,或者它的伴侣可以换一个其他的偶数
if (
evenMatch[i] === 0 ||
find(evenMatch[i], evens, evenMatch, match)
) {
evenMatch[i] = odd;// 更新这个偶数的伴侣为当前的奇数
return true;
}
}
}
return false;
};
//计算结果
const calculate = () => {
const evenMatch = new Array(evens.length).fill(0); //记录每个偶数的伴侣奇数
let cnt = 0;
// 对每个奇数进行匹配操作
for (const odd of odds) {
const match = new Array(evens.length).fill(false); // 创建一个数组,记录每个偶数是否已被占用
if (find(odd, evens, evenMatch, match)) {
cnt++; // 如果找到了素数伴侣,就增加计数
}
}
return cnt;
};
console.log(calculate());
})();


查看5道真题和解析