华为oj素数伴侣

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

输入:

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

输出:

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

输入

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

输出

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

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

对于这个题,我觉得题目的本意应该是使用匈牙利算法 计算最大匹配的问题,因为对于两个数的和为一个素数的话,必然是一个奇数一个偶数的组合,所以可以分为两个集合,来求二分图的最大匹配问题,但是博主当时也没想太多,就用了全排列来讨论所有的可能。这是最直接的想法,下面是c++实现的素数伴侣的代码

#include <iostream>
#include <algorithm>

using namespace std;
int maxx = 0;
int main(){
	bool sushu(int x,int y);
	void permutation(int* str,int length) ;

	int n;
	cin >> n;
	int * pi = new int[n];
	for (int i = 0; i < n;i++)
		cin >> pi[i];

	permutation(pi,n);
	cout << maxx << endl;
	return 0;
}

bool sushu(int x,int y){
	int i,N;
	N = x + y;
	int flag=true;
	if (N==1) return 0;
	if (N==2) return 1;
	for (i=2;i<=sqrt(N);i++){
		if (N%i==0) 
		{
			flag=false;
			break;
		}
	}
	return flag;
}
void permutation(int* str,int length)  
{  
	int count = 0;
    sort(str,str+length);  
    do  
    {  
		for(int i=0;i<length;i+=2)  {
			if (sushu(str[i],str[i+1]))
				count++;
		}
		if (maxx < count)
			maxx = count;
		count = 0;
    }while(next_permutation(str,str+length));  
}  
next_permutation()函数是c++提供了高效全排列算法,在使用这个函数的时候,一定要做排序处理。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值