当前位置:网站首页>华为机试题素数伴侣
华为机试题素数伴侣
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;
}
}
边栏推荐
- MySQL卸载文档-Windows版
- 如何解决数据库插入数据显示SQLSTATE[HY000]: General error: 1364 Field ‘xxxxx‘ doesn‘t have a default value错误
- MYSQL binlog相关命令
- 快速定量,Abbkine 蛋白质定量试剂盒BCA法来了!
- LM small programmable controller software (based on CoDeSys) Note 23: conversion of relative coordinates of servo motor operation (stepping motor) to absolute coordinates
- 肿瘤免疫治疗研究丨ProSci LAG3抗体解决方案
- The difference between string constants and string objects when allocating memory
- c语言(结构体)定义一个User结构体,含以下字段:
- uniapp开发小程序如何使用微信云托管或云函数进行云开发
- Matlab / envi principal component analysis implementation and result analysis
猜你喜欢
Navicat importing 15g data reports an error [2013 - lost connection to MySQL server during query] [1153: got a packet bigger]
Pinduoduo lost the lawsuit: "bargain for free" infringed the right to know but did not constitute fraud, and was sentenced to pay 400 yuan
使用TCP/IP四层模型进行网络传输的基本流程
How can I check the DOI number of a foreign document?
学习笔记|数据小白使用DataEase制作数据大屏
MySQL installation
二十岁的我4面拿到字节跳动offer,至今不敢相信
Leite smart home longhaiqi: from professional dimming to full house intelligence, 20 years of focus on professional achievements
How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet
A program lets you understand what static inner classes, local inner classes, and anonymous inner classes are
随机推荐
MySQL卸载文档-Windows版
JVM 全面深入
学术报告系列(六) - Autonomous Driving on the journey to full autonomy
docker-compose启动redis集群
Abnova 免疫组化服务解决方案
[start from scratch] detailed process of deploying yolov5 in win10 system (CPU, no GPU)
途家、木鸟、美团……民宿暑期战事将起
Unable to debug screen program with serial port
Redhat5 installing vmware tools under virtual machine
网络基础 —— 报头、封装和解包
leetcode 509. Fibonacci Number(斐波那契数字)
二十岁的我4面拿到字节跳动offer,至今不敢相信
如何解决数据库插入数据显示SQLSTATE[HY000]: General error: 1364 Field ‘xxxxx‘ doesn‘t have a default value错误
企业如何进行数据治理?分享数据治理4个方面的经验总结
Stack and queue-p78-8 [2011 unified examination true question]
Stack and queue-p79-9
Learning notes | data Xiaobai uses dataease to make a large data screen
How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet
String (explanation)
直击2022ECDC萤石云开发者大会:携手千百行业加速智能升级