当前位置:网站首页>华为机试题素数伴侣
华为机试题素数伴侣
2022-07-07 02:29:00 【晴天M雨天】
二分图最大匹配(匈牙利算法):素数伴侣
顶
题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如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
思路
考虑使用图论的方法来给这个题建模。100个数看成100个点,如果这两个数加起来的和是素数,给这两个数中间连一条边。之后,我们要选择尽可能多的边,要求这些边不共享端点。每个数的取值范围是[2,30000]。素数除了2是偶数,其他是奇数——而现在不可能出现2了,所以我们只考虑奇数的素数。2个数的和是奇数,只有奇数+偶数。所以,我们把这些数分成2堆——奇数和偶数,得到二分图。然后在他们中间,和是素数的,连上一条边,然后做匹配。对二分图的最大匹配,有一个简单很多的算法,匈牙利算法。
相关概念
二分图
二分图其实就是在一个图中所有的点可以分为两组,同一组中没有边,所有的边都跨越了两个组。准确的说:把一个图的顶点划分为两个不相交的集合 U 和 V ,且使得每一条边都分别连接 U 、V 中的顶点,如果存在这样的划分,则称此图为二分图。
此外二分图还有一个等价定义是:不含有「含奇数条边的环」的图。
匹配
二分图匹配就是边的集其中任意两条边没有公共顶点。我们定义有:
匹配边、匹配点、非匹配边、非匹配点。
如图:若1—2相连,5—4相连,7—6相连。则显然1—2边、5—4边、7—6边为匹配边,1、2、4、5、6、7为匹配点。剩下的为非匹配点和非匹配边。
最大匹配
一个图的匹配中所含边数最多的匹配即为此图最大匹配。像上图最大匹配即为:
显然最大匹配可能不只有一种。
完美匹配
如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。上图都是完美匹配。显然,完美匹配一定是最大匹配(完美匹配的任何一个点都已经匹配,添加一条新的匹配边一定会与已有的匹配边冲突)。但并非每个图都存在完美匹配。
交替路径
从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边……形成的路径叫交替路径。如图2—>1—>8—>7即为一条交替路径。
增广路径
从一个未匹配点出发,走交替路径,如果到达另一个未匹配点,则这条交替路径称为增广路径(agumenting path)。如图1—>2—>3—>6—>7—>8即为一条增广路径。
代码参考
import java.util.Scanner;
import java.util.ArrayList;
public class Main{
static int max=0;
public static void main(String[] args){
//标准输入
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
//输入正偶数
int n=sc.nextInt();
//用于记录输入的n个整数
int[] arr=new int[n];
//用于存储所有的奇数
ArrayList<Integer> odds=new ArrayList<>();
//用于存储所有的偶数
ArrayList<Integer> evens=new ArrayList<>();
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
//将奇数添加到odds
if(arr[i]%2==1){
odds.add(arr[i]);
}
//将偶数添加到evens
if(arr[i]%2==0){
evens.add(arr[i]);
}
}
//下标对应已经匹配的偶数的下标,值对应这个偶数的伴侣
int[] matcheven=new int[evens.size()];
//记录伴侣的对数
int count=0;
for(int j=0;j<odds.size();j++){
//用于标记对应的偶数是否查找过
boolean[] v=new boolean[evens.size()];
//如果匹配上,则计数加1
if(find(odds.get(j),matcheven,evens,v)){
count++;
}
}
System.out.println(count);
}
}
//判断奇数x能否找到伴侣
private static boolean find(int x,int[] matcheven,ArrayList<Integer> evens,boolean[] v){
for(int i=0;i<evens.size();i++){
//该位置偶数没被访问过,并且能与x组成素数伴侣
if(isPrime(x+evens.get(i))&&v[i]==false){
v[i]=true;
/*如果i位置偶数还没有伴侣,则与x组成伴侣,如果已经有伴侣,并且这个伴侣能重新找到新伴侣, 则把原来伴侣让给别人,自己与x组成伴侣*/
if(matcheven[i]==0||find(matcheven[i],matcheven,evens,v)){
matcheven[i]=x;
return true;
}
}
}
return false;
}
//判断x是否是素数
private static boolean isPrime(int x){
if(x==1) return false;
//如果能被2到根号x整除,则一定不是素数
for(int i=2;i<=(int)Math.sqrt(x);i++){
if(x%i==0){
return false;
}
}
return true;
}
}
边栏推荐
- 项目实战 五 拟合直线 获得中线
- 隐马尔科夫模型(HMM)学习笔记
- mobx 知识点集合案例(快速入门)
- Postgresql中procedure支持事务语法(实例&分析)
- Prompt for channel security on the super-v / device defender side when installing vmmare
- 反射(二)
- Wechat applet hides the progress bar component of the video tag
- FlexRay通信协议概述
- c语言面试写一个函数在字符串N中查找第一次出现子串M的位置。
- C language interview to write a function to find the first public string in two strings
猜你喜欢
2022 Android interview essential knowledge points, a comprehensive summary
A program lets you understand what static inner classes, local inner classes, and anonymous inner classes are
企業如何進行數據治理?分享數據治理4個方面的經驗總結
剑指offer-高质量的代码
线性代数(一)
What books can greatly improve programming ideas and abilities?
Tkinter window selects PCD file and displays point cloud (open3d)
Audio distortion analysis of DSP and DAC based on adau1452
反射(二)
Ant manor safety helmet 7.8 ant manor answer
随机推荐
"Parse" focalloss to solve the problem of data imbalance
企業如何進行數據治理?分享數據治理4個方面的經驗總結
PostgreSQL database timescaledb function time_ bucket_ Gapfill() error resolution and license replacement
Abnova 膜蛋白脂蛋白体技术及类别展示
[shell] summary of common shell commands and test judgment statements
大促过后,销量与流量兼具,是否真的高枕无忧?
dolphinscheduler3.x本地启动
拼多多败诉:“砍价免费拿”侵犯知情权但不构成欺诈,被判赔400元
ViewModelProvider.of 过时方法解决
js装饰器@decorator学习笔记
途家、木鸟、美团……民宿暑期战事将起
哈趣投影黑馬之姿,僅用半年强勢突圍千元投影儀市場!
快速定量,Abbkine 蛋白质定量试剂盒BCA法来了!
循环肿瘤细胞——Abnova 解决方案来啦
What are the classic database questions in the interview?
字符串常量与字符串对象分配内存时的区别
隐马尔科夫模型(HMM)学习笔记
软件测试到了35岁,真的就干不动了吗?
ESXI挂载移动(机械)硬盘详细教程
FlexRay通信协议概述