首页 > 其他分享 >HJ28 素数伴侣

HJ28 素数伴侣

时间:2024-09-02 10:47:41浏览次数:1  
标签:Prime 匹配 int dfs HJ28 素数 110 伴侣

题面:https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e?tpId=37&tqId=21251&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=&dayCountBigMember=365%E5%A4%A9

我的做法是用线性筛先筛出2倍max(a[i])内的素数,便于后面判断两数之和是否素数。

然后在两数之和为素数的两个点之间连边。

求最大匹配数,我一开始傻了,没想起来这是二分图匹配,没用匈牙利算法,用了dfs,然后n=32就tle了。

后来想起来这是二分图匹配,就用了匈牙利算法。

思路就是对于当前还没有匹配的点,dfs进行匹配,看能否为它找到匹配对象。dfs过程中,如果连边指向的点还没有匹配,或者它所对应的匹配点可以通过dfs再次找到下一个对象,则可以进行匹配,并且答案数目+1.  注意标记,防止进入环中死循环。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,a[110],cnt[110],pd[110][110],maxa;
 4 int MinSS[60010],Prime[60010],numPrime=0,ans=0;
 5 int match[110];
 6 bool isPrime[60010],BeiXuan[110],book[110];
 7 void XianXingShai(int n){
 8     for(int i=2;i<=n;i++){
 9         if(MinSS[i]==0){
10             MinSS[i]=i;
11             isPrime[i]=1;
12             Prime[++numPrime]=i;
13         }
14         for(int j=1;j<=numPrime;j++){
15             if(Prime[j]>MinSS[i]||Prime[j]*i>n)break;
16             MinSS[Prime[j]*i]=Prime[j];
17         }
18     }
19     return;
20 }
21 void initWork(){
22     for(int i=1;i<=n;i++)
23         for(int j=1;j<=n;j++){
24             if(i!=j&&isPrime[a[i]+a[j]])pd[i][++cnt[i]]=j;
25         }
26     return;
27 }
28 bool Dfs(int u){
29     book[u]=1;
30     for(int i=1;i<=cnt[u];i++){
31         int v=pd[u][i];
32         if(match[v]==0||(book[match[v]]==0&&Dfs(match[v]))){
33             match[v]=u;
34             match[u]=v;
35             return 1;
36         }
37     }
38     return 0;
39 }
40 int main(){
41     cin>>n;
42     for(int i=1;i<=n;i++)scanf("%d",&a[i]),maxa=max(maxa,a[i]);
43     maxa*=2;
44     XianXingShai(maxa);
45     initWork();//预处理出能配对的数
46     ans=0;
47     for(int i=1;i<=n;i++){
48         memset(book,0,sizeof(book));
49         if(match[i]==0&&Dfs(i))ans++;
50     }
51     cout<<ans;
52     return 0;
53 }

 

标签:Prime,匹配,int,dfs,HJ28,素数,110,伴侣
From: https://www.cnblogs.com/AlenaNuna/p/18392317

相关文章

  • 素数求解的学习1
    序素数即质数,它在自然数里的分布是不规律的,但是其在数学研究上占有重要地位。因此对于素数的求解法方法不断被人们优化着。在C语言中求解素数也是非常经典的一道题目,以下简单记录 我学习求解素数的收获。素数的暴力求解对与如同我这的初学者,首先学习以素数的基本概念求解素......
  • 7-1 素数对猜想(C语言)
    7-1素数对猜想题目参考代码#include<stdio.h>intmain(){ //一、用埃拉托斯特尼筛法,找出所有的素数 intnum[100002]; intN; scanf("%d",&N); for(inti=2;i<N+2;i++)//赋初值为1,表示均为素数 num[i]=1; //把未标记的数的的倍数,全部标记为非素......
  • 2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount
    2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,val)可以返回数组arr中大于val的元素数量。按照以下规则进行n次操作,将nums中的元素分配到两个数组arr1和arr2中:1.第一次操作将nums[1]加入arr1。2.第二次操作将nums[2]加入arr2。3.对......
  • c语言与素数相关的题目
    设计一个程序,输入N,输出0~N之间的所有素数先展示效果:代码如下#include<stdio.h>intmain(void){  inti,o,u,k=0;  printf("请输入一个整数");  scanf("%d",&i);  while(i>=2){    for(o=2;o<i;o++){    ......
  • 面试题:求[2, n)之间的素数个数
    题目:求[2,n)之间的素数个数素数的定义:素数是指大于1的自然数,除了1和它本身之外没有其他因数的数。也就是说,素数只能被1和它本身整除,不能被其他自然数整除。解法1最简单的实现思路是,实现素数判断函数,然后从2~n逐个判断,然后统计素数个数publicstaticintcountP......
  • 274471是素数吗?
    GPT-4o(OpenAI)为了判断274471是否是素数,我们需要确认它是否只有两个正因数:1和它本身。为此,我们可以检查它是否能被小于等于其平方根的任何素数整除。274471的平方根大约是523.95,因此我们需要检查它是否能被小于等于523的素数整除。为了简化过程,我们可以使用编程或......
  • C++判断素数模板
    首先是朴素方法代码:#include<bits/stdc++.h>usingnamespacestd;intnum;boolcheck(intnum){if(num<2){returnfalse;}for(inti=2;i<=sqrt(num);i++){if(num%i==0){returnfalse;}}returntr......
  • 数论——绝对素数、素数筛法、埃氏筛法、欧拉筛法、最大公约数
    绝对素数绝对素数是指一个素数在其十进制表示下,无论是从左向右读还是从右向左读,所得到的数仍然是素数。例如,13是一个素数,从右向左读是31,31也是素数,所以13是一个绝对素数。#include<iostream>#include<cmath>usingnamespacestd;boolisPrime(intnum){if(......
  • 数学基础-素数
    算术基本定理任何一个大于\(1\)的正整数\(N\)都能唯一分解为有限个质数的乘积,可写作:\[N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}\]其中\(c_i\)是正整数,\(p_i\)是质数,且满足\(p_1<p_2<...<p_m\)。推论:\(N\)的正约数的集合可写作:\[\{p_1^{b_1}p_2^{b_2}...p_m^{b_m}\}\]其......
  • 关于C语言中素数的求解
    什么是素数?一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数。(素数=质数)在C语言中求解素数的几种方法。方法一:直接试数法(从1开始逐一试数)例:求解100到200之间的素数。#include<stdio.h>intmain(){ inti=0; intcount=0; for(i=100;i<=......