OJ中-----素数伴侣(二分图,匈牙利算法)*?

来源:互联网 发布:linux 查看显存占用 编辑:程序博客网 时间:2024/05/19 08:40

描述

题目描述若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。

输入:

有一个正偶数N(N≤100),表示待挑选的自然数的个数。后面给出具体的数字,范围为[2,30000]。

输出:

输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。

 

知识点查找,搜索,排序运行时间限制10M内存限制128输入

输入说明
1 输入一个正偶数n
2 输入n个整数

输出

求得的“最佳方案”组成“素数伴侣”的对数。

样例输入4 2 5 6 13样例输出2

方法一:全排列出所有情况 prev_permutation

方法二:二分图匈牙利算法,能进行匹配的一定是 一个奇数,一个偶数,因此先将输入的数进行分类,在进行匹配。

方法一实现:测试:6 24 21 19 20 24 17 答案是3, (1)24-17 (2)21-20(3)19-24

# include <iostream>#include<cstring>#include <algorithm>using namespace std;bool issushu(int, int);int main(){int n;int max = 0;cin >> n;int a[100] ;for (int i = 0; i < n;i++){cin >> a[i];}//sort(a,a+n);do{int sum = 0;for (int k = 0; k < n;k+=2){if (issushu(a[k], a[k + 1])){ sum++; }}max = max>sum ? max : sum;} while (prev_permutation(a, a + n));cout << max << endl;system("pause");}bool issushu(int m,int n){bool bl = true;if (m + n < 2){ return false; }for (int i = 2; i*i <= (m + n);i++){if ((m + n) % i == 0){ bl = false; }}return bl;}

方法二:二分图的最优匹配




0 0
原创粉丝点击